Laden...

[Gelöst] Labels in voller Breite in eigenem Control mit Scrollviewer

Erstellt von dila71 vor 5 Jahren Letzter Beitrag vor 5 Jahren 830 Views
D
dila71 Themenstarter:in
103 Beiträge seit 2005
vor 5 Jahren
[Gelöst] Labels in voller Breite in eigenem Control mit Scrollviewer

Hallo,
nachdem ich bei meiner letzten Frage über den Scrollviewer gestolpert bin, glaube ich wieder an diesem zu scheitern, weiß aber nicht wie ich es besser machen kann.

Ich brauche eine Art Combobox, die aber beim Selektieren einige "spezielle" Verarbeitungen macht. Darum habe ich mir ein eigenes Control geschrieben.
Hier mein XAML-Code:

<ComboBox.ItemTemplate>
            <DataTemplate>
                <Label MouseUp="SuggestionMouseUp" Content="{Binding}" HorizontalAlignment="Stretch"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
        <ComboBox.Template>
            <ControlTemplate TargetType="ComboBox">
                <Grid >
                    <ToggleButton x:Name="ToggleButton" 
                                  IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
                                  Focusable="false"                           
                                  ClickMode="Press" HorizontalContentAlignment="Left" >

<!-- ausgeschnitten, da der Teil funktioniert -->

                    </ToggleButton>
                    <Popup Name="Popup"
                           Placement="Bottom"                        
                           AllowsTransparency="True" 
                           Focusable="False"  
                           IsOpen="{TemplateBinding IsDropDownOpen}"
                           PopupAnimation="Slide">
                        <Grid Name="DropDown"
                              SnapsToDevicePixels="True"  
                              MinWidth="{TemplateBinding ActualWidth}"
                              MaxHeight="{TemplateBinding MaxDropDownHeight}">
                            <Border x:Name="DropDownBorder"
                                    BorderThickness="1" 
                                    Background="White"
                                    BorderBrush="Black"/>
                            <ScrollViewer Name="myScroller"  Margin="4,6,4,6" SnapsToDevicePixels="True" DataContext="{Binding}" >
                                <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                            </ScrollViewer>
                        </Grid>
                    </Popup>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasItems" Value="false">
                        <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                    </Trigger>
                    <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                        <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
                        <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </ComboBox.Template>

Mein Problem ist nun, dass ich die Labels im <DataTemplate> nicht auf die volle Breite bekomme, so dass, wenn ich bei kurzen Einträgen hinter den Text klicke, zwar das Popup schließt aber nicht mein MouseUp="SuggestionMouseUp" ausgelöst wird, da ich ja außerhalb des Labels klicke.

Den Scrollviewer entfernen kann ich nicht, dann kann ich nur die Labels im initialen Popup sehen und nicht scrollen.
Ich habe schon ein Dock- statt Stackpanel verwendet, bekomme es da aber nicht gebacken die Labels untereinander anzuordnen.

Wie kann ich also die Labels mit linksbündigem Text auf volle breite stretchen, wobei das popup die breite des längsten Elementes annehmen soll?

Danke
Dirk

D
dila71 Themenstarter:in
103 Beiträge seit 2005
vor 5 Jahren

Die Lösung ist:

 <ComboBox.ItemContainerStyle>
            <Style TargetType="{x:Type ComboBoxItem}">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                            <ContentPresenter />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ComboBox.ItemContainerStyle>