Wpf 从网格中获取控件属性。代码隐藏中的资源

Wpf 从网格中获取控件属性。代码隐藏中的资源,wpf,resources,datatemplate,Wpf,Resources,Datatemplate,首先,有xaml代码: <Grid.Resources> <DataTemplate x:Name="dataTemp" x:Key="dtKey"> <WrapPanel Orientation="Horizontal" Name="mainWP"> <TextBlock Name="codeTB" FontSize="18" Width="200" Tex

首先,有xaml代码:

<Grid.Resources>
            <DataTemplate x:Name="dataTemp" x:Key="dtKey">
                <WrapPanel Orientation="Horizontal" Name="mainWP">
                    <TextBlock Name="codeTB" FontSize="18" Width="200" Text="{Binding barcode}"></TextBlock>
(...)
               </WrapPanel>
            </DataTemplate>
        </Grid.Resources>

(...)
和带有datatemplate的listview:

<ListView Name="testLV" Grid.Row="0" ItemTemplate="{StaticResource ResourceKey=dtKey}" >

        </ListView>

所以在代码隐藏中,我想将TextBlock width更改为this.width/5(因为width在另一台PC中可能不同),但因为它是数据模板,所以我无法访问此控件。 我还尝试了Width=“{Binding Path=ActualWidth,ElementName=grid0}”,但作为实际宽度,我需要像ActualWidth/5这样的东西,这不起作用


感谢使用Grid.ColumnDefinition来格式化您的网格,或者使用Ivaluconverter类让我们看看值转换器的开发

convert参数将作为您的计算参数, 您知道如何构造值转换器类

 public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        //value is grid actual width 
       // parameter = 5 is your calculated value

           return value / parameter;
    }

使用Grid.ColumnDefinition格式化您的网格,或者使用Ivaluconverter类让我们看看值转换器的开发

convert参数将作为您的计算参数, 您知道如何构造值转换器类

 public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        //value is grid actual width 
       // parameter = 5 is your calculated value

           return value / parameter;
    }

当所有子元素的
所需宽度
都得到满足时(换句话说,当网格的大小足够大,能够以相等的空间容纳所有列时),使用具有5列且每个列都具有
Width=“0.2*”
网格将可以正常工作。如果不能做到这一点,布局的工作方式是尽可能修剪元素,并为其他更需要它的列提供额外空间,从而覆盖过程中的
Width=“0.2*”

如果需要将5列平均拆分,只需使用
UniformGrid
。这几乎不在乎上述任何一件事

比如说:

<ListView Name="paragonLV" HorizontalContentAlignment="Stretch">
  <ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
      <Setter Property="Padding"
              Value="0" />
      <Setter Property="BorderThickness"
              Value="0" />
    </Style>
  </ListView.ItemContainerStyle>
  <ListView.ItemTemplate>
    <DataTemplate>
      <UniformGrid MaxWidth="{Binding RelativeSource={RelativeSource FindAncestor,
                                                                      AncestorType={x:Type ScrollViewer}},
                                      Path=ActualWidth}"
                    Columns="5">
        <UniformGrid.Resources>
          <Style TargetType="{x:Type TextBlock}">
            <Setter Property="TextTrimming"
                    Value="CharacterEllipsis" />
            <Setter Property="FontSize"
                    Value="18" />
            <Setter Property="HorizontalAlignment"
                    Value="Stretch" />
          </Style>
        </UniformGrid.Resources>
        <TextBlock Text="{Binding barCode}" />
        <TextBlock Text="{Binding nazwa}" />
        <TextBlock Text="{Binding jm}" />
        <TextBlock Text="{Binding ilosc}" />
        <TextBlock Text="{Binding cena}" />
      </UniformGrid>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

当满足所有子元素的
所需宽度时(换句话说,当网格的大小足够大,可以容纳所有具有相等空间的列时),使用具有5列且每个列都具有
Width=“0.2*”
网格将可以正常工作。如果不能做到这一点,布局的工作方式是尽可能修剪元素,并为其他更需要它的列提供额外空间,从而覆盖过程中的
Width=“0.2*”

如果需要将5列平均拆分,只需使用
UniformGrid
。这几乎不在乎上述任何一件事

比如说:

<ListView Name="paragonLV" HorizontalContentAlignment="Stretch">
  <ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
      <Setter Property="Padding"
              Value="0" />
      <Setter Property="BorderThickness"
              Value="0" />
    </Style>
  </ListView.ItemContainerStyle>
  <ListView.ItemTemplate>
    <DataTemplate>
      <UniformGrid MaxWidth="{Binding RelativeSource={RelativeSource FindAncestor,
                                                                      AncestorType={x:Type ScrollViewer}},
                                      Path=ActualWidth}"
                    Columns="5">
        <UniformGrid.Resources>
          <Style TargetType="{x:Type TextBlock}">
            <Setter Property="TextTrimming"
                    Value="CharacterEllipsis" />
            <Setter Property="FontSize"
                    Value="18" />
            <Setter Property="HorizontalAlignment"
                    Value="Stretch" />
          </Style>
        </UniformGrid.Resources>
        <TextBlock Text="{Binding barCode}" />
        <TextBlock Text="{Binding nazwa}" />
        <TextBlock Text="{Binding jm}" />
        <TextBlock Text="{Binding ilosc}" />
        <TextBlock Text="{Binding cena}" />
      </UniformGrid>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>


好吧,假设您在
网格
中使用此
数据模板
,为什么不直接设置
网格。相应地,使用此
数据模板
的列定义的宽度为“0.2*”,然后从
数据模板
中删除固定宽度规范。使用
TryFindResource(…)
只会使您的代码变得破旧,并在以后给您带来更多问题。您也可以使用转换器进行“实际宽度/5”,但请不要这样做。用正确的方式使用WPF(限制“幻数”固定大小规格),你将有更好的应用程序构建体验。嗯,但是我使用DataTemplate进行listview,我会编辑第一篇文章,并显示我不确定你说的是否正确:)在DataTemplate中,我有5个文本块的wrappanel。所以现在我需要把Listview放到列中-ok。但是WrapPanel中的所有控件呢?我只想将整个宽度拆分为5个控件(文本块),它们位于Wrappanel内部。在这种情况下,当我使用Grid.ColumnDefinition时,我只将ListView放入网格宽度的0.2*中。但我想在DataTemplate中声明0.2*foreach控件。所以我需要ListView有100%的宽度,DataTemplate中的foreach控件(比如ColumnDefinition)来定义它们的宽度,现在我得到了它。作为DataTemplate,我应该使用带有columnn定义的网格,而不是Wrappanel,对吗?;)好的,现在一切似乎都正常了,但是0.2*的宽度被计算为20%的宽度?因为看起来不像:PWell假设您在
网格中使用此
数据模板
,为什么不直接设置
网格。相应地,列定义
的宽度为“0.2*”对于使用此
DataTemplate
的列,然后一起从
DataTemplate
中删除固定宽度规范。使用
TryFindResource(…)
只会使您的代码变得破旧,并在以后给您带来更多问题。您也可以使用转换器进行“实际宽度/5”,但请不要这样做。用正确的方式使用WPF(限制“幻数”固定大小规格),你将有更好的应用程序构建体验。嗯,但是我使用DataTemplate进行listview,我会编辑第一篇文章,并显示我不确定你说的是否正确:)在DataTemplate中,我有5个文本块的wrappanel。所以现在我需要把Listview放到列中-ok。但是WrapPanel中的所有控件呢?我只想将整个宽度拆分为5个控件(文本块),它们位于Wrappanel内部。在这种情况下,当我使用Grid.ColumnDefinition时,我只将ListView放入网格宽度的0.2*中。但我想在DataTemplate中声明0.2*foreach控件。所以我需要ListView有100%的宽度,DataTemplate中的foreach控件(比如ColumnDefinition)来定义它们的宽度,现在我得到了它。作为DataTemplate,我应该使用带有columnn定义的网格,而不是Wrappanel,对吗?;)好的,现在一切似乎都正常了,但是0.2*的宽度被计算为20%的宽度?因为看起来不像:P