根据文本块的RowSpan值,在文本末尾添加冒号或右对齐

时间:2013-12-29 00:22:36

标签: wpf xaml

我有一个文本块,如下面的代码所示:

<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。我怎样才能做到这一点?

如果可能,我可以使用另一个文本块作为冒号。

1 个答案:

答案 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>

注意事项

  1. 我已将ContentBlock替换为ContentControl(我不确定此选项是否可供您使用)
  2. 我想使用纯XAML方法,因此我的默认模板是管理RowSpan&gt;的模板。 1.然后我提供一个触发器,将模板设置回默认的RowSpan = 1。
  3. 这需要是一种键控样式,因为将其设置为默认样式可能会破坏在其逻辑或可视树中使用ContentControl的所有其他控件。
  4. 如果您不想使用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>
    

    显然,冒号可能会被错过,因为它被向上推到控件的右侧,但我会给你留下格式。

    我希望这会有所帮助。