WPF Pobranie długości jednego elementu w ListBoxie

Odpowiedz Nowy wątek
2016-11-08 10:57
0

Witajcie !
Mam ListBoxa i dla jego "elementów" przypisuję DataTemplate w zależności od tego czy dany element jest IsSelected czy też nie. To mi działa idealnie. Zamieszczam kod, a poniżej opis problemu:

<UserControl x:Class="Logowanie.Kontrolki.Moduly.cModuleHistoryPanel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="640">
    <UserControl.Resources>
        <DataTemplate x:Key="resListItem">
            <Grid Width="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ActualWidth}">
                <Border CornerRadius="10" Background="#BC067878" BorderBrush="Black">
                    <TextBlock Text="NORMALNY" />
                </Border>
            </Grid>
        </DataTemplate>
        <DataTemplate x:Key="resListSelecetedItem">
            <Border CornerRadius="15" Background="#BC067878" BorderBrush="Black">
                <TextBlock Text="ZAZNACZONY" />
            </Border>
        </DataTemplate>
        <Style TargetType="{x:Type ListBoxItem}" x:Key="ListBoxContainerStyle">
            <Setter Property="ContentTemplate" Value="{StaticResource resListItem}"/>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource resListSelecetedItem}"/>
                </Trigger>
            </Style.Triggers>
        </Style> 
    </UserControl.Resources>
    <Grid Opacity="0">
        <Grid.Style>
            <Style TargetType="Grid">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=Visible}" Value="False">
                        <DataTrigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Duration="0:0:0.200" Storyboard.TargetProperty="Opacity" From="1" To="0"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </DataTrigger.EnterActions>
                        <DataTrigger.ExitActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Duration="0:0:0.200" Storyboard.TargetProperty="Opacity" From="0" To="1"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </DataTrigger.ExitActions>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Style>
        <Border Background="Black" BorderThickness="3" CornerRadius="10" BorderBrush="#FF457BB2" Grid.ColumnSpan="10" Grid.RowSpan="10">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="75"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="75"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="75"/>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="25"/>
                    <RowDefinition Height="5"/>
                </Grid.RowDefinitions>
                <Image Source="Zasoby/ModuleHistory.png" Margin="5,5,5,5"/>
                <ListBox x:Name="hDataGrid" Grid.Column="1" Grid.Row="1" ItemContainerStyle="{StaticResource ListBoxContainerStyle}">

                </ListBox>
            </Grid>
        </Border>
    </Grid>
</UserControl>

Na początku bez określania długości grid'a elementy wyglądały tak:
e2afd7e11e.png
Moim kolejnym celem było rozszerzyć grid'a tak, aby dopasowywał długość na cały obszar elementu. Użyłem do tego celu relative source, lecz wtedy w ogóle nie było widać elementów.

<Grid Width="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ActualWidth}">
                <Border CornerRadius="10" Background="#BC067878" BorderBrush="Black">
                    <TextBlock Text="NORMALNY" />
                </Border>
            </Grid> 

Spróbowałem wtedy tak:

<Grid Width="{Binding ElementName=hListBox, Path=ActualWidth}"> 

Grid faktycznie się rozciągnął, niestety aż za bardzo, ponieważ dopasował się do rozmiaru ListBoxa, a nie Elementu ListBoxa. Rysunek poniżej.
a5c0c49138.png
jak widać prawa strona elementu wychodzi poza obszar ListBoxa.

Potrafi ktoś naprowadzić i pomóc?

EDIT:
hListBox == hDataGrid (zmieniłem podczas analizowania kodu i pisania postu)

edytowany 1x, ostatnio: gswidwa, 2016-11-08 10:59
nie moge sprawdzić ale może coś takiego? tylko zamiast windows to co listboxitem. Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}" - topik92 2016-11-08 12:35
Niestety, po tym program się wysypuje - "Błąd inicjalizacji" - gswidwa 2016-11-08 21:13

Pozostało 580 znaków

2016-11-08 21:15
0

Poszedłem na okrętkę, zawężyłem pole rendringu dzieląc grida na kolumny. Ale miło byłoby dowiedzieć się na przyszłość co nie tak :)

@DibbyDum jeżeli możesz nie zmieniaj mojego tematu jako "rozwiązanego", gdyż jest to rozwiązane w sposób niewłaściwy (mimo, że wizualnie wszystko cacy). Dalej poszukuje odpowiedzi jak to zrobić, grzebię, grzebię i liczę na Waszą pomoc. Ale doceniam, że dbacie o to forum i przejrzystość wątków : ) Pozdrawiam !!!

Hmm spoko nie ma problemu, ale zawsze wydawało mi się że właśnie po to służą takie rzeczy jak grid(i jego elementy jak kolumny czy wiersze), stackpanele czy inne tego typu kontrolki żeby rozplanować widok, ułożenie kontrolek i dostępne im miejsce skoro już je w nie wpychamy. :) - DibbyDum 2016-11-08 23:37
No tak do tego sluza, Ale poprawnie jest ustawić szerokość elementu tak żeby mieścił się w listboxie :D - gswidwa 2016-11-09 06:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0