Как использовать сеттеры внутри одного и того же стиля, чтобы по-разному изменять элементы одного типа внутри стилизованного элемента управления? - PullRequest
1 голос
/ 02 апреля 2019

У меня есть Grid и в нем два Path с. Когда один стиль применяется к Grid, первый Path должен иметь некоторые Data, а второй - другие данные. Когда применяется стиль секунд, первый Path должен иметь другой Data, а второй Path должен иметь другой другой Data. Я хочу иметь возможность установить имя целевого элемента Setter.

Я попробовал код ниже. Я получаю два креста вместо одного треугольника слева и один крест справа.

<Window x:Class="cs_wpf_test_2.MainWindow"
        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"
        xmlns:local="clr-namespace:cs_wpf_test_2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style x:Key="styleWithPlusSign" TargetType="Path">
            <Setter Property="Path.Data" Value="M 5,95 L 95,95 50,5 5,95"></Setter>
            <Setter Property="Path.Data" Value="M 50,10 L 50,10 L 50,90 M 10,50 L 90,50"></Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Path Stroke="Blue"
                Stretch="Fill"
                x:Name="MyFirstPath"
              Style="{StaticResource styleWithPlusSign}"
              />
        <Path Grid.Column="1" Stroke="Black"
                StrokeThickness="4"
                Stretch="Uniform"
                x:Name="MySecondPath"
              Style="{StaticResource styleWithPlusSign}"/>
    </Grid>
</Window>

actual result

Я получаю желаемый результат, используя этот негибкий код:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Path Stroke="Blue"
        Stretch="Fill"
        x:Name="MyFirstPath"
        Data="M 5,95 L 95,95 50,5 5,95"
        />
    <Path Grid.Column="1" Stroke="Black"
        StrokeThickness="4"
        Stretch="Uniform"
        x:Name="MySecondPath"
        Data="M 50,10 L 50,10 L 50,90 M 10,50 L 90,50"/>
</Grid>

Скриншот:

wished result

Если я пытаюсь использовать TargetName атрибут Setter s, я получаю ошибки:

XDG0029 | Имя «MyFirstPath» не распознано.

XDG0029 | Имя «MySecondPath» не распознано.

Обновление

Прошу прощения за неясность. Я хочу 2 стиля, например styleWithPlusSign и styleWithMinusSign.

  • styleWithPlusSign должен установить треугольник с углом, направленным вверх, и крестом справа.
  • styleWithMinusSign должен установить треугольник с углом, направленным вниз, и знаком минус (линия) справа.

1 Ответ

2 голосов
/ 02 апреля 2019

вот решение с триггером: я просто проверяю, равен ли номер столбца 0, в этом случае я отображаю треугольник, либо крестик.

<Window.Resources>
    <Style x:Key="styleWithPlusSign" TargetType="Path">
        <Style.Triggers>
            <Trigger Property="Grid.Column" Value="0">
                <Setter  Property="Path.Data" Value="M 5,95 L 95,95 50,5 5,95"></Setter>
            </Trigger>
        </Style.Triggers>
        <Setter Property="Path.Data" Value="M 50,10 L 50,10 L 50,90 M 10,50 L 90,50"></Setter>
    </Style>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Path Grid.Column="0" Stroke="Blue"
          Stretch="Fill"
          x:Name="MyFirstPath"
          Style="{StaticResource styleWithPlusSign}"
    />
    <Path Grid.Column="1" Stroke="Black"
          StrokeThickness="4"
          Stretch="Uniform"
          x:Name="MySecondPath"
          Style="{StaticResource styleWithPlusSign}"/>
</Grid>


если вам нужно уточнить номер столбца для каждого пути:

<Window.Resources>
    <Style x:Key="styleWithPlusSign" TargetType="Path">
        <Style.Triggers>
            <Trigger Property="Grid.Column" Value="0">
                <Setter  Property="Path.Data" Value="M 5,95 L 95,95 50,5 5,95"></Setter>
            </Trigger>
            <Trigger Property="Grid.Column" Value="1">
                <Setter Property="Path.Data" Value="M 50,10 L 50,10 L 50,90 M 10,50 L 90,50"></Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...