XAML 分层模板格式化问题/疑问

smtd7mpg  于 2023-05-21  发布在  其他
关注(0)|答案(1)|浏览(181)

我有几个关于TreeView的分层模板格式的问题。此图像将说明:

  • 我想删除字体顶部和边框之间的多余空间。
  • 我想把图标放在两行字中间
  • 我想加一个千位逗号。我已经尝试过了,但是在绑定数据时添加逗号有问题。

下面是第三层的XAML代码:

<HierarchicalDataTemplate 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    ItemsSource="{Binding XPath=Unit}"
    >
    <Grid Height="42" Width="auto" >
        <Grid Height="41" HorizontalAlignment="Left" Margin="0,0,0,0" Name="grid1" VerticalAlignment="Top" Width="auto">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="100" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto" />
                <RowDefinition Height="auto" />
            </Grid.RowDefinitions>
            <Image Source= "{Binding XPath=UnitIcon}" Grid.Column="1" Grid.RowSpan="2" VerticalAlignment="Center"  HorizontalAlignment="Left" Stretch="None" OpacityMask="White"></Image>
            <Label Content="{Binding XPath=UnitName}" Height="54" HorizontalAlignment="Left" Name="label4" VerticalAlignment="Top" FontFamily="Smythe" FontSize="18"  Margin="0,0,0,0"  Grid.RowSpan="3" Grid.Column="2" Grid.ColumnSpan="3"/>
            <Label Content="Strength:"  FontFamily="Amaltea WF" FontSize="12" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Center"  Grid.Column="2" Grid.Row="2"/>
            <TextBlock  Text="{Binding XPath=UnitStrength, ConverterParameter=N0}" Margin="0,0,0,0" FontFamily="BauderieScriptSSK Bold" FontSize="18"   HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="3" Grid.Row="2"/>
                
        </Grid>
         <Line X1='0'
              X2='200'
              Y1='0'
              Y2='0'
              Stroke="Gray"
              StrokeThickness='1' />
    </Grid>
</HierarchicalDataTemplate>
9o685dep

9o685dep1#

1.从“单元名称”标签上取下固定高度。你有网格单元,你不想要固定的高度。该间隙的一部分可能是字体的行高。在标签上临时设置Background="LightSkyBlue",以查看标签本身实际占用的空间。
1.图像上的VerticalAlignment="Center"看起来没有达到预期的效果,因为您在所有内容上设置了冲突的固定高度。您的grid1固定为41个单位高,但其中的单位名称为54个单位高。布局引擎正在尽最大努力遵守您给它的矛盾命令。
删除XAML中的每个固定高度。所有人,没有例外。让事情自己发展。如果你必须给一个控件施加一个固定的高度,考虑把它的内容放在一个ViewBox中,这样内容就可以动态地调整自己的大小,而不会溢出容器。或者不;这看起来很奇怪。但首先要让你的相对布局工作,然后开始工作,把它塞进任何有限的空间,你有它。
当您在XAML布局方面遇到问题时,天真的冲动是添加一些东西。最糟糕的是,添加 random 的东西--“我不知道这个属性是什么意思,也不知道它的值是什么意思,但如果我在这个控件上添加它,也许它会修复另一个控件的问题!“最好的情况是,你添加的东西是无害的。
别这样*删除 * 的东西,而不是,然后建立备份。一次添加一件事,看看它会做什么。并且在没有阅读文档的情况下不添加任何内容。从Intellisense * 添加六个随机属性似乎 * 比在MSDN上查找一个属性花费更少的时间,但实际情况并非如此,因为第一种方法总是完全浪费时间。这就像闭上眼睛开车,试图通过你撞到的障碍物的感觉来控制方向。
1.您将正确的格式字符串赋给了错误的属性。试试这个:

<TextBlock Text="{Binding XPath=UnitStrength, StringFormat=N0}"

除了哇哈哈哈哈,这不适用于Binding.XPath,所以我在胡说八道。这个也不一样

<Label Content="{Binding XPath=UnitStrength}" ContentStringFormat="N0" />

我怀疑他们失败了,因为你给他们一个字符串,而不是一个整数,但这只是一个猜测。
但这个管用。

public class IntToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int n = 0;

        if (Int32.TryParse((string)value, out n))
        {
            value = n.ToString((String)parameter);
        }
        return value;
    }

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

XAML.YOUR_NAMESPACE_HERE是定义IntToStringConverter类的C#命名空间。这不一定是正确的它可以位于父标记或此XAML文件中的任何包含标记上,包括根标记(WindowUserControlResourceDictionary)。把它放在这里会使这个例子更加独立。

<HierarchicalDataTemplate
    xmlns:local="clr-namespace:YOUR_NAMESPACE_HERE"
    >
    <HierarchicalDataTemplate.Resources>
        <local:IntToStringConverter
            x:Key="IntToString"
            />
    </HierarchicalDataTemplate.Resources>

    <!-- blah blah -->

    <TextBlock 
        Text="{Binding XPath=UnitStrength, Converter={StaticResource IntToString}, ConverterParameter=N0}" 
        />

更新

<Window.Resources>
    <!-- stuff -->

    <HierarchicalDataTemplate 
        x:Key="UnitTemplate"
        ItemsSource="{Binding XPath=Unit}"
        >
        <Grid Width="auto">
            <!-- stuff -->
        </Grid>
    </HierarchicalDataTemplate>

    <!-- stuff -->
</Window.Resources>

对于TreeView:

<TreeView
        ...
        ItemTemplate="{StaticResource UnitTemplate}"
        ...
        />

但是,如果模板只在一个地方使用,这也可以工作:

<TreeView
    ...
    >
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate 
            ItemsSource="{Binding XPath=Unit}"
            >
            <Grid Width="auto">
                <!-- stuff -->
            </Grid>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

另一个Upate

或者最后,如果你想把所有的数据模板放在一个文件中,你想创建一个资源字典:

<Window.Resources>
    <!-- If you're doing the merged thing, you have to explicitly have the 
         ResourceDictionary tag here. 
    -->
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="DataTemplates.xaml" />
        </ResourceDictionary.MergedDictionaries>

        <!-- other resources maybe -->
    </ResourceDictionary>
</Window.Resources>

DataTemplate.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:ScenarioEditor"
    >
    <local:IntToStringConverter
        x:Key="IntToString"
        />

    <HierarchicalDataTemplate 
        x:Key="UnitTemplate"
        ItemsSource="{Binding XPath=Unit}"
        >
        <Grid Width="auto">
            <!-- stuff -->
        </Grid>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate 
        x:Key="SomeOtherTemplate"
        >
        <Grid Width="auto">
            <!-- different stuff -->
        </Grid>
    </HierarchicalDataTemplate>
</ResourceDictionary>

又一更新

所以我们看到的树有多个层次,每个层次有不同的模板。至少有两种方法可以做到这一点:如果我们有一个包含不同子类型的.NET类树,我们可以在资源字典中定义“隐式模板”。它们有一个DataType属性而不是x:Key,结果(例如)带有DataType="{x:Type local:HQ}"的模板将自动用于显示该类型的任何类示例。
但是你有XML,所以这是行不通的。您可以做的是为每个HierarchicalDataTemplate提供其自己的ItemTemplate。为了清楚起见,下面的示例省略了ItemsSource和许多其他内容--它只说明了我们如何设置这些父/子模板关系。

<HierarchicalDataTemplate
    x:Key="UnitTemplate"
    >
    <Grid>
        <!-- Unit stuff -->
    </Grid>
</HierarchicalDataTemplate>

<HierarchicalDataTemplate 
    x:Key="CommanderTemplate"
    ItemTemplate="{StaticResource UnitTemplate}"
    >
    <Grid>
        <!-- Commander stuff -->
    </Grid>
</HierarchicalDataTemplate>

<HierarchicalDataTemplate 
    x:Key="HQTemplate"
    ItemTemplate="{StaticResource CommanderTemplate}"
    >
    <Grid>
        <!-- HQ stuff -->
    </Grid>
</HierarchicalDataTemplate>

HQTemplate将是树视图的ItemTemplate

<TreeView 
    ...
    ItemTemplate="{StaticResource HQTemplate}"

相关问题