Autor |
Beitrag |
FrEEzE2046
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Mi 21.04.10 13:52
Hallo,
ich brauche genau so eine Popup Listbox wie man sie vom klassichen MSDN Design kennt.
Beispiel:
msdn.microsoft.com/d...ia.imagedrawing.aspx
Unter Einstellungen müsst ihr noch klassich wählen. Wenn ihr nun die Maus über System.Windows.Media-Namespace bewegt erscheint die Listbox. Wie kann ich das für meine Silverlight Seite machen?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 21.04.10 17:24
Unter DropDownButton sollten sich passende Controls finden lassen  . Dass sich die Popups automatisch öffnen/schließen, solltest du ja über Events/Blend Behaviors noch nachrüsten können.
Edit: Wahrscheinlich ist es einfacher, direkt ein UserControl aus TextBlock/... und darunter einem Popup zu bauen und das Ganze über Events/Behaviors zu steuern.
_________________ >λ=
|
|
FrEEzE2046 
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Di 27.04.10 11:38
Kha hat folgendes geschrieben : | Edit: Wahrscheinlich ist es einfacher, direkt ein UserControl aus TextBlock/... und darunter einem Popup zu bauen und das Ganze über Events/Behaviors zu steuern. |
Hi,
mir fehlt der richtige Ansatz. Könntest du bitte etwas konkreter werden?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 27.04.10 12:17
|
|
FrEEzE2046 
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Di 27.04.10 13:56
Hallo,
ich hab da nochmal eine andere Frage. Ein neues UserControl hat ein Text-Property, dass an ein TextBlock-Element weitergereicht werden soll.
Ich habe dafür folgenden Code gefunden:
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:
| public class MyClass : UserControl { public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(DropDownTextBlock), null);
[BindableAttribute(true)] public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public MyClass() { this._TextBlock.SetBinding ( TextBlock.TextProperty, new Binding() { Source = this, Path = new PropertyPath("Text") } ); } } |
Jetzt stellt sich mir die Frage, warum man nicht einfach folgendes macht:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| public class MyClass : UserControl { public string Text { get { return this._TextBlock.Text; } set { this._TextBlock.Text = value; } } } |
Gibt es da einen besonderen Grund?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 27.04.10 14:52
Neue Frage, neues Topic bitte  . Aber vielleicht genügt dir schon dieser Link, da hast du erst einmal ein wenig zum Lesen  : msdn.microsoft.com/e...ibrary/ms752914.aspx
_________________ >λ=
|
|
FrEEzE2046 
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Di 27.04.10 15:07
Also ich hätte es jetzt so weit:
XML-Daten 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| <UserControl x:Class="DropDownTextBlockProject.DropDownTextBlock" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400">
<StackPanel x:Name="LayoutRoot"> <TextBlock x:Name="_TextBlock" MouseEnter="UserControl_MouseEnter" MouseLeave="UserControl_MouseLeave"/> <Popup x:Name="_Popup"> <ListBox x:Name="_ListBox" MouseEnter="UserControl_MouseEnter" MouseLeave="UserControl_MouseLeave" Width="{Binding ElementName=_TextBlock, Path=ActualWidth}" Background="{Binding ElementName=LayoutRoot, Path=Background}" /> </Popup> </StackPanel> </UserControl> |
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: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| public partial class DropDownTextBlock : UserControl { public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(DropDownTextBlock), null);
[BindableAttribute(true)] public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } }
public ItemCollection Items { get { return this._ListBox.Items; } }
public DropDownTextBlock() { InitializeComponent();
this.LayoutRoot.SetBinding ( Panel.BackgroundProperty, new Binding() { Source = this, Path = new PropertyPath("Background") } ); this._TextBlock.SetBinding ( TextBlock.TextProperty, new Binding() { Source = this, Path = new PropertyPath("Text") } ); }
private void UserControl_MouseEnter(object sender, MouseEventArgs e) { this._Popup.IsOpen = true; }
private void UserControl_MouseLeave(object sender, MouseEventArgs e) { this._Popup.IsOpen = false; } } |
Das Control ist bei mir aber immer Weiß, egal was ich für einen Background-Wert setze. Woran liegt das?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 27.04.10 16:39
Ich habe deinen Code 1:1 übernommen, mit
XML-Daten 1:
| <my:DropDownTextBlock Text="Huh" Background="Red" /> |
bekomme ich auch ein rotes StackPanel und Popup.
Die Bindings kannst du über RelativeSource übrigens auch in XAML setzen. Ich benutze dafür gerne zusätzlich noch den DataContext, falls nicht schon andersweitig verwendet.
XML-Daten 1: 2: 3: 4:
| <UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}">
<StackPanel x:Name="LayoutRoot" Background="{Binding Background}" ... |
Und falls du immer das gleiche Datenmodell durch das UserControl anzeigen lassen willst, sind eigene Dependency Properties eigentlich unnötig, übergib lieber direkt das Model an das UC.
_________________ >λ=
|
|
FrEEzE2046 
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Di 27.04.10 17:24
Danke für deine Antwort. Also, ich hab das StackPanel jetzt so definiert:
XML-Daten 1:
| <StackPanel x:Name="LayoutRoot" Background="{Binding Background}"> |
und dafür das manuelle Binding im Konstruktor entfernt.
Mein UC ist aber immer noch dauerhaft weiß. Hier mein Beispielcode:
XML-Daten 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:DropDownTextBlockProject;assembly=DropDownTextBlockProject" x:Class="DropDownTextBlockTestEnv.MainPage" Width="640" Height="480">
<Grid x:Name="LayoutRoot" Background="White"> <local:DropDownTextBlock Text="Dies ist ein Test" Background="Red" Margin="50" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center" > <local:DropDownTextBlock.Items> <TextBlock Text="Hallo"/> <TextBlock Text="Hallo"/> <TextBlock Text="Hallo"/> </local:DropDownTextBlock.Items> </local:DropDownTextBlock> </Grid> </UserControl> |
Beim string Property "Text" hab ich jedoch keine andere Wahl, als das Ganze im CodeBehind zu machen soweit ich weiß.
Was genau meinst du damit, dass ich eigentlich kein DependencyProperty für meine Daten brauche? Ich hab für die Daten doch die ItemCollection:
C#-Quelltext 1: 2: 3: 4:
| public ItemCollection Items { get { return this._ListBox.Items; } } |
|
|
|