Autor Beitrag
FrEEzE2046
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
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)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
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)
BeitragVerfasst: Di 27.04.10 11:38 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 27.04.10 12:17 
So in etwa hatte ich mir das vorgestellt.
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
    <StackPanel>
        <TextBlock MouseEnter="both_MouseEnter"
                   MouseLeave="both_MouseLeave"
                   Background="Gray"
                   x:Name="block">Hello</TextBlock>
        <Popup x:Name="pop"
               MouseEnter="both_MouseEnter"
               MouseLeave="both_MouseLeave">
            <TextBlock Background="Gray">World</TextBlock>
        </Popup>
    </StackPanel>

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    private void both_MouseEnter(object sender, MouseEventArgs e)
    {
      pop.IsOpen = true;
    }

    private void both_MouseLeave(object sender, MouseEventArgs e)
    {
      pop.IsOpen = false;
    }

_________________
>λ=
FrEEzE2046 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
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)
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
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)
BeitragVerfasst: Di 27.04.10 15:07 
Also ich hätte es jetzt so weit:

ausblenden 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.Text binding is done in code -->
        <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>


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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 27.04.10 16:39 
Ich habe deinen Code 1:1 übernommen, mit
ausblenden 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
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)
BeitragVerfasst: Di 27.04.10 17:24 
Danke für deine Antwort. Also, ich hab das StackPanel jetzt so definiert:
ausblenden 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:
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
public ItemCollection Items
{
  get { return this._ListBox.Items; }
}