Как обратиться к элементу XAML с помощью C# в WPF приложении?

276
19 декабря 2017, 15:35

Для примера есть 2 кнопки с разным контентом

<Button Name="ToggleButton" Height="40" Width="40" Cursor="Hand" Style="{DynamicResource PlayerButton}">
    <Grid Width="10" Height="15" >
        <Path Name="ToggleButtonPath" Data="M8 5v14l11-7z" Fill="White" Stretch="Fill" Height="15" Width="11"/>
    </Grid>
</Button>
<Button Name="NextButton" Height="40" Width="40" Cursor="Hand" Style="{DynamicResource PlayerButton}">
    <Grid Width="10" Height="15">
        <Path Name="NextButtonPath" Data="M8 5v14l11-7z" Fill="White" Stretch="Fill" Height="15" Width="11"/>
    </Grid>
</Button>

Отличаются в кнопках только Path.

Как можно реализовать программу так, чтобы не нужно было прописывать для каждого Path своё имя, но можно было изменять Path.

Для примера через имя кнопки ToggleButton.Path.Fill = ...

Answer 1

Когда вы помещаете что-то внутрь тега Button - на самом деле вы устанавливаете этой кнопке свойство Content, соответственно через Content и можно попробовать добраться до нужного элемента. Это будет выглядеть примерно так:

((Path)((Grid)Button.Content).Children[0]).Fill = ...

Но я вам не рекомендую так делать, ведь это, во-первых, не удобно и громоздко, во-вторых, не надежно, т.к. фактически дерево элементов может отличаться от того, что вы видите в разметке

Answer 2

Я бы оформил ваш код в виде стиля. Заодно не нужно дублировать код с контентом:

<Style TargetType="Button" x:Key="PlayerButton">
    <!-- тут ваш старый стиль -->
</Style>
<!-- это будет ваш новый стиль -->
<Style TargetType="Button" x:Key="PlayerButtonEx" BasedOn="{StaticResource PlayerButton}">
    <Setter Property="Width" Value="40"/>
    <Setter Property="Height" Value="40"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Setter Property="Content">
        <Setter.Value>
            <Grid Width="10" Height="15" >
                <!-- цвет Fill берём из свойства Foreground кнопки -->
                <Path Data="M8 5v14l11-7z"
                      Fill="{Binding Foreground, RelativeSource={RelativeSource FindAncestor,
                                                 AncestorType=Button}}"
                      Stretch="Fill" Height="15" Width="11"/>
            </Grid>
        </Setter.Value>
    </Setter>
</Style>

Использовать так:

<Button Name="ToggleButton" Style="{DynamicResource PlayerButtonEx}" Foreground="Blue"/>
<Button Name="NextButton" Style="{DynamicResource PlayerButtonEx}" Foreground="Blue"/>
READ ALSO
Реализация конструктора по умолчанию

Реализация конструктора по умолчанию

Добрый деньПомогите разобраться с теорией

253
Проблема с тегами в UWP

Проблема с тегами в UWP

В дизайнере пытаюсь создать NavigationView или PersonPicture но они подчёркиваются и вот какие ошибки:

254
Что содержит System.Security.Policy namespace?

Что содержит System.Security.Policy namespace?

Понятного объяснения предназначения содержимого этого пространства имён в сети я не обнаружилНа сколько я понимаю, классы, представленные...

272
Электронная цифровая подпись

Электронная цифровая подпись

Видел куски кода на c#, но не особо шарю в этомМожете объяснить на пальцах, как это реализовать?

202