创建水印模板texblock wpf

时间:2016-05-05 10:15:11

标签: c# wpf styles textblock datatrigger

我有以下代码,可以在任何"WaterMark"控件上放置TextBlock wpf

<TextBlock Text="Some Text" IsHitTestVisible="False" Foreground="Gray" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Normal">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Visibility" Value="Hidden"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=FromFrameComboBox, Path=SelectedItem}" Value="{x:Null}">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

为了防止为bind TextBlock这个UserControl每个控件重复这些行,我希望从中创建<ComboBox x:Name="FromFrameComboBox" Grid.Row="0" Grid.Column="1" ItemsSource="{Binding OrDataContainers.ObjectsCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" VerticalAlignment="Center" SelectedItem="{Binding OrDataContainers.SelectedObject, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="0,5,0,0"/> <Wpf:WatermarkTextBlock x:Name="FromFrameComboBoxText" Text="Select Frame Number" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> 并使用它:

TextBlock

(我已将dll定义放在包含的<TextBlock x:Class="Wpf.WatermarkTextBlock" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" IsHitTestVisible="False" Foreground="Gray" FontWeight="Normal"> <TextBlock.Style> <Style TargetType="TextBlock"> <Setter Property="Visibility" Value="Hidden"/> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=AvailableFrames, Path=SelectedItem}" Value="{x:Null}"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> 文件中,它看起来像这样:

DataTrigger

问题是dll绑定到我目前拥有的控件,在我正在开发的应用程序中: AvailableFrames ,如果我希望重用此DataTrigger 1}}在另一个应用程序中,我需要更改num = num ^ (num >> 16); num = num ^ (num >> 8); num = num ^ (num >> 4); num = num ^ (num >> 2); num = num ^ (num >> 1); 绑定。

可以这样做吗?

1 个答案:

答案 0 :(得分:1)

在这个具体案例中,NullToVisibilityConverter将是一个更简单的解决方案

public class NullToVisibilityConverter : MarkupExtension, IValueConverter
{
    public Visibility NullValue { get; set; }
    public Visibility NotNullValue { get; set; }
    public NullToVisibilityConverter()
    {
        NullValue = Visibility.Collapsed;
        NotNullValue = Visibility.Visible;
    }
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return NullValue;
        return NotNullValue;
    }


    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

用法示例:

<ComboBox x:Name="FromFrameComboBox"/>
<TextBlock Visibility="{Binding SelectedItem, ElementName=FromFrameComboBox, 
                                Converter={local:NullToVisibilityConverter NullValue=Visible, NotNullValue=Hidden}}"/>