Entwickler-Ecke
WPF / Silverlight - Usercontrol in MainWinwow anzeigen (WPF)
MK2291 - Mo 01.12.14 11:48
Titel: Usercontrol in MainWinwow anzeigen (WPF)
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^^):
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:
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:
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# - Mo 01.12.14 17:05
Hallo,
ich vermute mal schwer wegen dieser Zeile:
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.
MK2291 - 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# - Mo 01.12.14 19:51
Also ich würde es so angehen (bin kein Experte in WPF):
MainWindow (liegt hier im Namespace "Test"):
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:
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:
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"); } }
private string text;
public NumPad() { InitializeComponent(); }
private void Button_Click(object sender, RoutedEventArgs e) { Text += ((Button) sender).Content; }
private void ButtonDelete_Click(object sender, RoutedEventArgs e) { if (Text.Length > 0) Text = Text.Substring(0, Text.Length - 1); }
private void ButtonClearAll_Click(object sender, RoutedEventArgs e) { Text = ""; }
protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new 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.
Ich hoffe das trifft es grob.
MK2291 - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!