Как установить передний план на часть текста в установщике триггера? - PullRequest
0 голосов
/ 17 января 2019

Мне нужно написать часть текста внутри кнопки с другим передним планом. До сих пор, следуя этому решению , я использовал следующий фрагмент кода:

<Button>
  <TextBlock Margin="20"
           FontSize="24"
           FontStyle="Normal"
           FontWeight="Medium"
           Foreground="#FF1384F5">
       <Run>text1</Run>
       <Run Foreground="#FF1372D3" Text="{Binding MyBinding}"/>
       <Run >text2</Run>
   </TextBlock>
</Button>

Теперь мне нужно изменить весь текст на основе триггера, поэтому я построил DataTriger, как показано ниже:

<TextBlock.Style>
     <Style TargetType="{x:Type TextBlock}">
         <Style.Triggers>
             <DataTrigger Binding="{Binding MyBoolean}" Value="True">
                 <Setter Property="Text">
                      <Setter.Value>
                           <Run>text1</Run>
                           <Run Foreground="#FF1372D3" Text="{Binding MyBinding}"/>
                           <Run >text2</Run>
                      </Setter.Value>
                  </Setter>
              </DataTrigger>
             <DataTrigger Binding="{Binding MyBoolean}" Value="False">
                 <Setter Property="Text" Value="text3" />
              </DataTrigger>
          </Style.Triggers>
      </Style>
</TextBlock.Style>

конечно, это не работает, потому что значение свойства устанавливается более одного раза. В поисках решения я нашел это . Это в основном говорит, чтобы использовать мульти привязки

<Setter.Value>
    <MultiBinding StringFormat="{}{0}{1}{2}"><!-- Format as you wish -->
        <Binding Path="SelectedItem.iso"/>
        <Binding Source="{x:Static System:Environment.NewLine}"/>
        <Binding Path="SelectedItem.value"/>
    </MultiBinding>
</Setter.Value>

Но я не уверен, подходит ли он моей ситуации и как его использовать в конечном итоге.

1 Ответ

0 голосов
/ 17 января 2019

Run s будет установлено в свойство TextBlock.Inlines, которое имеет только геттер, но не сеттер. Таким образом, вы не можете установить Run s в стиле.

Вы можете использовать два TextBlock элемента и связать MyBoolean со свойством Visibility из них:

<Grid>
    <Grid.Resources>
        <local:BoolToVisConverter x:Key="btoviscnv"/>
    </Grid.Resources>
    <TextBlock Text="text3" Visibility="{Binding MyBoolean, Converter={StaticResource btoviscnv}, ConverterParameter='not'}"/>
    <TextBlock Visibility="{Binding MyBoolean, Converter={StaticResource btoviscnv}}">
        <Run>text1</Run>
        <Run Foreground="#FF1372D3" Text="{Binding MyBinding}"/>
        <Run>text2</Run>
    </TextBlock>
</Grid>

public class BoolToVisConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var bvalue = (bool)value;
        if ((parameter as string)?.Equals("not") ?? false)
        {
            bvalue = !bvalue;
        }
        return bvalue ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException("It's one way converter");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...