我有一个文本块,如下面的代码所示:
<TextBlock Grid.Row=........
.................
Grid.RowSpan="{Binding RowSp}"
HorizontalAlignment="Left" />
现在我想查看是否RowSpan > 1
然后我想在文本的末尾添加一个空格和一个冒号。我认为(未尝试)我使用触发器得到它和转换器如下面的代码中所述:
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="{Binding RowSp,
Converter={StaticResource colonAlignmentConverter}}"
Value="True" >
<Setter Property="Text"
Value="{Binding Txt,
Converter=ColonAlignmentConverter}" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
public class ColonAlignmentConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (int)value > 1;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
现在问题在于:
如果RowSpan = 1
那么我想在同一个Grid.Row和Grid.Column中添加冒号(:),但我想要它right aligned
。我怎样才能做到这一点?
如果可能,我可以使用另一个文本块作为冒号。
答案 0 :(得分:2)
这通常是通过模板完成的,但是,正如您所知,您无法模拟TextBlock。
但是,当您将字符串传递给ContentControl的Content属性时,ContentControl使用TextBlock来显示字符串。这是通过使用Snoop发现的,这是一个非常棒的WPF调试工具。
考虑到这一点,Grid.RowSpan对于网格的任何子节点的默认值为1,并且只要TextBlock的RowSpan大于1时您想显示冒号,以下将执行的操作你想要的。
<Window x:Class="StackOverflow._20820850.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style x:Key="TextBlockContentControlStyle" TargetType="{x:Type ContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Grid>
<TextBlock Text="{TemplateBinding Content}" />
<TextBlock Text=":" HorizontalAlignment="Right"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Grid.RowSpan" Value="1">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Grid>
<TextBlock Text="{TemplateBinding Content}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ContentControl Content="One" Style="{StaticResource TextBlockContentControlStyle}" />
<ContentControl Content="Two" Grid.Column="1" Grid.RowSpan="2" Style="{StaticResource TextBlockContentControlStyle}" />
</Grid>
</Window>
注意事项
如果您不想使用ContentControl,另一种方法是创建自己的UserControl。在下面,我创建了一个名为MyTextBlock的控件(我可以将其命名为TextBlock并让命名空间对其进行排序,但在一个示例中更清楚)然后我模板化控件的内容。用户控件的XAML是
<UserControl x:Name="ThisControl" x:Class="StackOverflow._20820850.MyTextBlock" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300">
<UserControl.ContentTemplate>
<DataTemplate>
<Grid DataContext="{Binding ElementName=ThisControl}">
<TextBlock Text="{Binding Path=Content}" />
<TextBlock Text=":" HorizontalAlignment="Right">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type TextBlock}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding (Grid.RowSpan)}" Value="1">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</DataTemplate>
</UserControl.ContentTemplate>
</UserControl>
窗口中的网格现在看起来像
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<this:MyTextBlock Content="One" />
<this:MyTextBlock Content="Two" Grid.Column="1" Grid.RowSpan="2" />
</Grid>
显然,冒号可能会被错过,因为它被向上推到控件的右侧,但我会给你留下格式。
我希望这会有所帮助。