Wpf 从网格中获取控件属性。代码隐藏中的资源
首先,有xaml代码: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
<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