none
Zugriff auf Attribute von dynamischen Steuerelementen RRS feed

  • Frage

  • Hallo MSDN-Forum,

    ich würde gerne den folgenden statischen Code durch den darauf folgenden dynamischen Code ersetzten.

    Statischer Code:

    <UniformGrid Columns="4">
            <StackPanel x:Name="stkAllgemein" VerticalAlignment="Center" Margin="20,0,20,0">
                <Image Source="img/allgemein.png"/>
                <Label x:Name="lblAllgemein" Content="Allgemein" HorizontalAlignment="Center" FontSize="{Binding Path=ActualWidth, Converter={StaticResource FontSizeConverter}, ElementName=stkAllgemein, Mode=OneWay}"/>
            </StackPanel>
            <StackPanel VerticalAlignment="Center" Margin="20,0,20,0">
                <Image Source="img/it.png"/>
                <Label x:Name="lblIT" Content="IT" HorizontalAlignment="Center" FontSize="{Binding Path=ActualWidth, Converter={StaticResource FontSizeConverter}, ElementName=stkAllgemein, Mode=OneWay}"/>
            </StackPanel>
            <StackPanel VerticalAlignment="Center" Margin="20,0,20,0">
                <Image Source="img/marketing.png"/>
                <Label x:Name="lblMarketing" Content="Marketing" HorizontalAlignment="Center" FontSize="{Binding Path=ActualWidth, Converter={StaticResource FontSizeConverter}, ElementName=stkAllgemein, Mode=OneWay}"/>
            </StackPanel>
            <StackPanel VerticalAlignment="Center" Margin="20,0,20,0">
                <Image Source="img/smartphone.png"/>
                <Label x:Name="lblSmartphone" Content="Mobil" HorizontalAlignment="Center" FontSize="{Binding Path=ActualWidth, Converter={StaticResource FontSizeConverter}, ElementName=stkAllgemein, Mode=OneWay}"/>
            </StackPanel>
        </UniformGrid>


    Dynamischer Code:

    <ItemsControl ItemsSource="{Binding}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="4"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel VerticalAlignment="Center" Margin="20,0,20,0">
                        <Image Source="{Binding Path=Pfad}"/>
                        <Label Content="{Binding Path=Bereichsname}"/>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

    Leider kann ich bei der dynamischen Variante die FontSize nicht festlegen, da ich keinen Zugriff auf die Breite des dynamischen StackPanels habe. Weiß jemand wie ich diesen Zugriff herstellen kann bzw. wie ich dieses Problem lösen könnte? Würde mich über jede Antwort freuen.

    Viele Grüße

    Kevin

    Dienstag, 29. April 2014 13:05

Antworten

  • Hallo,
    ich verstehe dein Problem nicht so ganz, du hast doch ein StackPanel zum anbinden zur verfügung!?
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <StackPanel VerticalAlignment="Center" Margin="20,0,20,0" Name="sp">
          <Image Source="{Binding Path=Pfad}"/>
          <Label Content="{Binding Path=Bereichsname}"  FontSize="{Binding Path=ActualWidth, ElementName=sp, Converter={StaticResource FontSizeConverter}, Mode=OneWay}"/>
    Falls du dir nicht sicher warst ob das Funktioniert, jedes Item hat als DataContext das Item aus der ItemsSource. Dadurch ist es auch kein Problem, das das StackPanel am Ende mehrmals mit dem gleichen Namen auftaucht, zugreifen darauf kannst du sowieso nur innerhalb des ItemTemplates.



    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert kevink003 Dienstag, 29. April 2014 15:09
    Dienstag, 29. April 2014 13:22
    Moderator

Alle Antworten

  • Hallo,
    ich verstehe dein Problem nicht so ganz, du hast doch ein StackPanel zum anbinden zur verfügung!?
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <StackPanel VerticalAlignment="Center" Margin="20,0,20,0" Name="sp">
          <Image Source="{Binding Path=Pfad}"/>
          <Label Content="{Binding Path=Bereichsname}"  FontSize="{Binding Path=ActualWidth, ElementName=sp, Converter={StaticResource FontSizeConverter}, Mode=OneWay}"/>
    Falls du dir nicht sicher warst ob das Funktioniert, jedes Item hat als DataContext das Item aus der ItemsSource. Dadurch ist es auch kein Problem, das das StackPanel am Ende mehrmals mit dem gleichen Namen auftaucht, zugreifen darauf kannst du sowieso nur innerhalb des ItemTemplates.



    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert kevink003 Dienstag, 29. April 2014 15:09
    Dienstag, 29. April 2014 13:22
    Moderator
  • Danke für die schnelle Antwort, das auslesen der Breite funktioniert jetzt wunderbar. Ich würde auch gerne die Breite für folgenden Code auslesen.

    <Window.MinWidth>
    	<Binding ConverterParameter="Width" Converter="{StaticResource MinSizeConverter}" ElementName="Test" Mode="OneWay" Path="ActualWidth"/>
    </Window.MinWidth>

    Leider wird dieser Code übersprungen. Weiß jemand wie ich den Zugriff herstellen kann? Vielen Dank im Voraus.

    Dienstag, 29. April 2014 14:20
  • Hallo,
    das geht so leider nicht.

    Du könntest aber einen Konverter ('DivisionConverter') schreiben, der die Breite des ItemsControls (per Binding) mit der Spaltenzahl (per Parameter) zur Minimalbreite verrechnet (per Division der Breite durch den Parameter).

    Wenn du noch weitere Frage dazu hast, mache bitte eine neue Frage auf. So bleibt die Übersicht des Threads besser gewahrt.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 29. April 2014 15:31
    Moderator