Autor Beitrag
MK2291
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 01.12.14 11:48 
Hallo liebes Forum,

gleich mal zu meiner Frage. Ich möchte ein NumPadControl in einem MainWindow anzeigen lassen. Mein NumPadControl beinhaltet momentan zu Übungszwecken nur einen Button. Das NumPadControl soll entweder rechts oder links am MainWidow "angedockt" werden. Im MainWindow habe ich 2 Textboxen erstellt die jeweils in verschiedenen Grid.Columns sind. Also erste Textbox ist in Column 1 und 2 in Column 2. Jetzt zu meinem Problem. Ich habe 3 Columns erstellt und will das NumPadControl als anfang ganz rechts anzeigen lasse. Das mach ich so (stimmt aber wohl nicht ganz, weil es nicht funktioniert^^):


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        numPadControl = new NumPadControl();
            CbxNum.Content = numPadControl;
            CbxNum.Visibility = System.Windows.Visibility.Visible;
            GspSplitter.Visibility = System.Windows.Visibility.Visible;
            Content = numPadControl;
            grid.ColumnDefinitions[3].MinWidth = 100;
            grid.ColumnDefinitions[3].Width = new GridLength(1, GridUnitType.Star);
            this.Width += 250;
            this.MinWidth = 150;


Hier mein XAML Code:
NumPadControl:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Button Name="Btn9" Content="9" Margin="15,135" Click="Btn_Click" />
    </Grid>


MainWindow:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
 <Grid Name="grid">
        
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="150" MaxWidth="2000" />
            <ColumnDefinition MinWidth="150" MaxWidth="2000"/>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="auto"/>
                </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>          
        </Grid.RowDefinitions>
        
        <TextBox Name="Txb1" Grid.Column="0" Margin="15" Grid.Row="0" MaxHeight="30"/>
        <TextBox Name="Txb2" Grid.Column="1" Margin="15" Grid.Row="0" MaxHeight="30"/>
        <ContentPresenter x:Name="CbxNum" Grid.Row="0" Grid.Column="2"/>
        <GridSplitter Name="GspSplitter" Width="2" Grid.Row="0" Grid.Column="1" BorderBrush="Black" BorderThickness="2"            Margin="0 5"  ResizeDirection="Columns" ResizeBehavior="PreviousAndNext" Visibility="Collapsed"   />
        
    </Grid>



Wenn ich das wie oben gezeigt mache verschwinden die Textboxen und nur das NumpadControl ist im MainWindow sichtbar. In MainWindow.xaml.cs rufe ich über ein MainWindow_Loaded event die LoadNumPadControl Methode auf. Kann mir da jemand weiter Helfen?
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 01.12.14 17:05 
Hallo,

ich vermute mal schwer wegen dieser Zeile:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
numPadControl = new NumPadControl();
            CbxNum.Content = numPadControl;
            CbxNum.Visibility = System.Windows.Visibility.Visible;
            GspSplitter.Visibility = System.Windows.Visibility.Visible;
            Content = numPadControl;
            grid.ColumnDefinitions[3].MinWidth = 100;
            grid.ColumnDefinitions[3].Width = new GridLength(1, GridUnitType.Star);
            this.Width += 250;
            this.MinWidth = 150;

Zuerst ordnest du dein NumPadControl dem ContentPresenter zu - was ja auch richtig ist. Danach ordnest du es aber auch noch dem Window selbst zu und das ist das Problem. Im XAML Code definierst du ja das Fenster. Dieses Fenster hat genau ein Child (bzw. Content) und kann auch nicht mehr haben. Dieser Content ist standardmäßig das Grid. In diesem Grid sind auch deine TextBoxen. Mit der oben markierten Zeile wirfst du also das komplette Grid aus dem Layout raus.
Lösche die markierte Zeile, dann sollte es gehen.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler

Für diesen Beitrag haben gedankt: MK2291
MK2291 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 01.12.14 17:25 
Hallo C#,

sehr sehr herzlichen dank.So ein Fehler, ist wirklich peinlich:(.Hätte noch eine kleine Frage. Wie schaff ich es am "besten" (programmier freundlichsten) das ich in beide Textboxen die 9 rein schreiben kann. Geht das am besten per setfocus?

PS: Oder muss ich mit der Frage einen neuen Thread erstellen?
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 01.12.14 19:51 
Also ich würde es so angehen (bin kein Experte in WPF):

MainWindow (liegt hier im Namespace "Test"):
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:test="clr-namespace:Test"
        Title="MainWindow" Height="350" Width="525">
    <Grid Name="grid">

        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="150" MaxWidth="2000" />
            <ColumnDefinition MinWidth="150" MaxWidth="2000"/>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <TextBox Name="Txb1" Grid.Column="0" Margin="15" Grid.Row="0" MaxHeight="30" Text="{Binding ElementName=MyNumPad, Path=Text, Mode=TwoWay}" />
        <TextBox Name="Txb2" Grid.Column="1" Margin="15" Grid.Row="0" MaxHeight="30" Text="{Binding ElementName=MyNumPad, Path=Text, Mode=TwoWay}" />
        <test:NumPad x:Name="MyNumPad" Grid.Row="0" Grid.Column="2"/>
        <GridSplitter Name="GspSplitter" Width="2" Grid.Row="0" Grid.Column="1" BorderBrush="Black" BorderThickness="2" 
                      Margin="0,5"  ResizeDirection="Columns" ResizeBehavior="BasedOnAlignment" Visibility="Visible"   />

    </Grid>
</Window>


Das UserControl NumPad:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
 <Grid MinWidth="200" MinHeight="260">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        
        <Button Name="Button0" Content="0" Margin="10,10" Click="Button_Click" Grid.Row="3" Grid.Column="1" />
        <Button Name="Button1" Content="1" Margin="10,10" Click="Button_Click" Grid.Row="2" Grid.Column="0" />
        <Button Name="Button2" Content="2" Margin="10,10" Click="Button_Click" Grid.Row="2" Grid.Column="1" />
        <Button Name="Button3" Content="3" Margin="10,10" Click="Button_Click" Grid.Row="2" Grid.Column="2" />
        <Button Name="Button4" Content="4" Margin="10,10" Click="Button_Click" Grid.Row="1" Grid.Column="0" />
        <Button Name="Button5" Content="5" Margin="10,10" Click="Button_Click" Grid.Row="1" Grid.Column="1" />
        <Button Name="Button6" Content="6" Margin="10,10" Click="Button_Click" Grid.Row="1" Grid.Column="2" />
        <Button Name="Button7" Content="7" Margin="10,10" Click="Button_Click" Grid.Row="0" Grid.Column="0" />
        <Button Name="Button8" Content="8" Margin="10,10" Click="Button_Click" Grid.Row="0" Grid.Column="1" />
        <Button Name="Button9" Content="9" Margin="10,10" Click="Button_Click" Grid.Row="0" Grid.Column="2" />
        
        <Button Name="ButtonDelete" Content="Del"  Margin="10,10" Click="ButtonDelete_Click"  Grid.Row="3" Grid.Column="0" />
        <Button Name="ButtonClearAll" Content="CE"  Margin="10,10" Click="ButtonClearAll_Click"  Grid.Row="3" Grid.Column="2" />
    </Grid>


und der Code dazu:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
 public partial class NumPad : UserControl, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        
        public string Text
        {
            get { return text; }
            set
            {
                if (text == value) return;
                text = value;
                OnPropertyChanged("Text");   // for databinding
            }
        }

        private string text;

        public NumPad()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e) // button 0..9 is pressed
        {
            Text += ((Button) sender).Content; // add button text (0..9) to current text
        }

        private void ButtonDelete_Click(object sender, RoutedEventArgs e)
        {
            if (Text.Length > 0)
                Text = Text.Substring(0, Text.Length - 1); // remove the last character from Text
        }

        private void ButtonClearAll_Click(object sender, RoutedEventArgs e)
        {
            Text = "";
        }
        

        // from interface INotifyPropertyChanged
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null) PropertyChanged(thisnew PropertyChangedEventArgs(propertyName));
        }
    }


Zuerst habe ich das UserControl erstellt mit den Ziffern 0..9 und der Möglichkeit die letzte Ziffer oder den ganzen Text zu löschen. Das NumPad implementiert das Interface INotifyPropertyChanged, welches benötigt wird, damit die Datenbingung in MainWindow funktioniert.
Dann habe ich den ContentPresenter rausgeworfen und das NumPad direkt in das Layout gesetzt (finde ich persönlich geschickter).
Zum Schluss habe ich dann noch den Inhalt der TextBoxen (sicher dass es TextBlock nicht auch tut?) an die Text-Eigenschaft des NumPads gebunden und zwar in beide Richtungen.

Wenn du jetzt im NumPad auf den Buttons rumdrückst, sollten in beiden TextBoxen die Ziffern drin stehen. Wenn du in einer TextBox den Inhalt änderst, sollte das NumPad das ebenfalls bemerken und seinen Text entsprechend anpassen.
Screenshot
Ich hoffe das trifft es grob.
Einloggen, um Attachments anzusehen!
_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler

Für diesen Beitrag haben gedankt: MK2291
MK2291 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 01.12.14 21:45 
Danke für die sehr schnelle Antwort C#. Ist ein guter Lösungsweg. Hättest dir aber nicht extra so viel Arbeit machen müssen^^. Aber nett wirklich danke. Das mit den Textboxen ist nicht ganz das was ich wollte. Ich wollte das ich z.B. mit einem Keydownevent in die Textbox klicke und nur in die Textbox schreibe wo ich rein geklickt habe . Aber das schaff ich jetzt schon selber^^. Hab dir eh schon zu viele Probleme bereitet. Und nochmals danke^^. Bin aber für Tipps offen