请教大家一个关于silverlight中动态改变style中的值的问题

chengzhi0921 2012-05-28 09:38:07
样式代码如下

<Style x:Key="Style2" TargetType="Primitives:DataGridColumnHeader">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Primitives:DataGridColumnHeader">
<Border Name="aaa" Background="Gold" Width="50">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>


我想在后台c#代码中改变ControlTemplate 中名为'aaa'的border的width的值,应该怎么弄?
我自己写了一段;
 
public static DependencyProperty BorderProperty = DependencyProperty.Register("Border", typeof(Border), typeof(MainPage), null);
Style style = this.Resources["Style2"] as Style;
SetterBaseCollection setterBaseCollection = style.Setters;
Setter setter = setterBaseCollection[2] as Setter;
ControlTemplate controlTemplate = setter.Value as ControlTemplate;
object c = controlTemplate.GetValue(BorderProperty );

但是在获取controlTemplate.GetValue(BorderProperty )时老是取到null,BorderProperty 应该怎么写,这种方法可以改变aaa的width的值吗,或者还有另外的方法?
谢谢
...全文
490 12 打赏 收藏 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sundayX 2012-05-29
  • 打赏
  • 举报
回复
字体的话,改变datagrid的字符大小就会应用到标题上的。那些不能适应的控件,可能就需要重新设计模板了。
assky124 2012-05-29
  • 打赏
  • 举报
回复
如果你的控件是从Control派生的

有个方法可以获得模板里的控件

GetTemplateChild("Name");
chengzhi0921 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你那个style是针对Primitives:DataGridColumnHeader类型的,而你的BorderProperty是针对MainPage的,两个根本没什么关系啊?怎么会取得到?
[/Quote]
改成DataGridColumnHeader也取不到啊
chengzhi0921 2012-05-28
  • 打赏
  • 举报
回复
主要就是想改变列标题的字体大小,字体好像不能自适应,因为我的页面要上大屏幕,就是那种几米高的屏幕,如果不设字体大小的话,到时展示时会变得很小.还有没有其他方法解决?
好像单选按钮上的小圆圈就不会自动适应窗口,还有日历控件也无法自适应.
sundayX 2012-05-28
  • 打赏
  • 举报
回复
你那个style是针对Primitives:DataGridColumnHeader类型的,而你的BorderProperty是针对MainPage的,两个根本没什么关系啊?怎么会取得到?
sundayX 2012-05-28
  • 打赏
  • 举报
回复
涉及到分辨率时,感觉就变得麻烦了呢。
分辨率变时,像datagrid列标题这种没必要也变吧,使用默认的呢?
在silverlight中,不设置控件的具体大小时,控件本身就会自适应窗口的。
chengzhi0921 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
XML code

<!--DataGridColumnHeader的原始样式-->
<Style TargetType="primitives:DataGridColumnHeader">
<Setter Property="Foreground" Value="#FF000000"/>
<Setter Property="Horizon……
[/Quote]
问题是我的Style 要自适应几种分辨率,应该不能把Style 中值定死,要在加载页面时获取屏幕分辨率后在设置
sundayX 2012-05-28
  • 打赏
  • 举报
回复

<!--DataGridColumnHeader的原始样式-->
<Style TargetType="primitives:DataGridColumnHeader">
<Setter Property="Foreground" Value="#FF000000"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="SeparatorBrush" Value="#FFC9CACA"/>
<Setter Property="Padding" Value="4"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="primitives:DataGridColumnHeader">
<Grid x:Name="Root">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimation Duration="0" To="#FF448DCA" Storyboard.TargetProperty="(Fill).Color" Storyboard.TargetName="BackgroundRectangle"/>
<ColorAnimation Duration="0" To="#7FFFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[3].Color" Storyboard.TargetName="BackgroundGradient"/>
<ColorAnimation Duration="0" To="#CCFFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[2].Color" Storyboard.TargetName="BackgroundGradient"/>
<ColorAnimation Duration="0" To="#F2FFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[1].Color" Storyboard.TargetName="BackgroundGradient"/>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<ColorAnimation Duration="0" To="#FF448DCA" Storyboard.TargetProperty="(Fill).Color" Storyboard.TargetName="BackgroundRectangle"/>
<ColorAnimation Duration="0" To="#D8FFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[0].Color" Storyboard.TargetName="BackgroundGradient"/>
<ColorAnimation Duration="0" To="#C6FFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[1].Color" Storyboard.TargetName="BackgroundGradient"/>
<ColorAnimation Duration="0" To="#8CFFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[2].Color" Storyboard.TargetName="BackgroundGradient"/>
<ColorAnimation Duration="0" To="#3FFFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[3].Color" Storyboard.TargetName="BackgroundGradient"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="SortStates">
<VisualState x:Name="Unsorted"/>
<VisualState x:Name="SortAscending">
<Storyboard>
<DoubleAnimation Duration="0" To="1.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SortIcon"/>
</Storyboard>
</VisualState>
<VisualState x:Name="SortDescending">
<Storyboard>
<DoubleAnimation Duration="0" To="1.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SortIcon"/>
<DoubleAnimation Duration="0" To="-.9" Storyboard.TargetProperty="(RenderTransform).ScaleY" Storyboard.TargetName="SortIcon"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle x:Name="BackgroundRectangle" Grid.ColumnSpan="2" Fill="#FF1F3B53" Stretch="Fill"/>
<Rectangle x:Name="BackgroundGradient" Grid.ColumnSpan="2" Stretch="Fill"><!--这个Rectangle关系到Header的背景色,和鼠标操作相关颜色-->
<Rectangle.Fill>
<LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
<GradientStop Color="#FCFFFFFF" Offset="0.015"/>
<GradientStop Color="#F7FFFFFF" Offset="0.375"/>
<GradientStop Color="#E5FFFFFF" Offset="0.6"/>
<GradientStop Color="#D1FFFFFF" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Grid HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ContentPresenter Content="{TemplateBinding Content}"/><!--ContentPresenter就是呈现标题的部分-->
<Path x:Name="SortIcon" Grid.Column="1" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z " Fill="#FF444444" HorizontalAlignment="Left" Margin="4,0,0,0" Opacity="0" RenderTransformOrigin=".5,.5" Stretch="Uniform" VerticalAlignment="Center" Width="8">
<Path.RenderTransform>
<ScaleTransform ScaleY=".9" ScaleX=".9"/>
</Path.RenderTransform>
</Path>
</Grid>
<Rectangle x:Name="VerticalSeparator" Grid.Column="1" Fill="{TemplateBinding SeparatorBrush}" Visibility="{TemplateBinding SeparatorVisibility}" VerticalAlignment="Stretch" Width="1"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

首先DataGridColumnHeader是应该填充DataGrid的标题栏的,这点可以通过更改BackgroundGradient的Fill来测试,所以没必要单独设置一个Width的哦。
至于设置Header的FontSize,设置DataGrid的FontSize时也会应用于Header的FontSize。

如果打算单独设置列的背景色和字体大小,那么可以改写那个style,这样设置例如

<Style TargetType="primitives:DataGridColumnHeader">
<Setter Property="Foreground" Value="#FF000000"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="Red"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="SeparatorBrush" Value="#FFC9CACA"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Padding" Value="4"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="primitives:DataGridColumnHeader">
<Grid x:Name="Root">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Rectangle x:Name="BackgroundRectangle" Grid.ColumnSpan="2" Fill="#FF1F3B53" Stretch="Fill"/>
<Rectangle x:Name="BackgroundGradient" Grid.ColumnSpan="2" Stretch="Fill" Fill="{TemplateBinding Background}"/><!--将Rectangle的背景色与Header自身Background绑定-->
<Grid HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ContentControl FontSize="{TemplateBinding FontSize}"><!--添加一个ContentControl用于设置FontSize,并与Header自身FontSize绑定-->
<ContentPresenter Content="{TemplateBinding Content}"/>
</ContentControl>
<Path x:Name="SortIcon" Grid.Column="1" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z " Fill="#FF444444" HorizontalAlignment="Left" Margin="4,0,0,0" Opacity="0" RenderTransformOrigin=".5,.5" Stretch="Uniform" VerticalAlignment="Center" Width="8">
<Path.RenderTransform>
<ScaleTransform ScaleY=".9" ScaleX=".9"/>
</Path.RenderTransform>
</Path>
</Grid>
<Rectangle x:Name="VerticalSeparator" Grid.Column="1" Fill="{TemplateBinding SeparatorBrush}" Visibility="{TemplateBinding SeparatorVisibility}" VerticalAlignment="Stretch" Width="1"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

chengzhi0921 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
我一直没明白为什么要设置那个border的宽度呢?
[/Quote]
不设置border的宽度的话,列表头的背景色只会把字体的宽度渲染,其他的则不会改变;
我现在还要改变<Setter Property="FontSize" Value="15"/>的值,
 Style style = this.Resources["Style2"] as Style;
SetterBaseCollection setterBaseCollection = style.Setters;
//setterBaseCollection.Add(new Setter(DataGridColumnHeader.FontSizeProperty,20));
//Object o = setterBaseCollection.GetValue(DataGridColumnHeader.FontSizeProperty);
Setter setter = setterBaseCollection[1] as Setter;
setter.Value = 20.0;//这句报错,说试图执行未经授权的操作。

谢谢
sundayX 2012-05-28
  • 打赏
  • 举报
回复
我一直没明白为什么要设置那个border的宽度呢?
chengzhi0921 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
汗,谁说改成DataGridColumnHeader就能取到了。

法1:扩展DataGridColumnHeader,添加BorderWith属性,然后在style里将Border的width与该属性绑定, Width="{TemplatedBinding BorderWidth}"
法2:使用VisualTreeHelper尝试一下,前提是你能取到DataGridColumnHeader……
[/Quote]

大哥,这个怎么扩展啊,是直接写个类,继承DataGridColumnHeader,然后在xmlns:类名吗?
我刚从java那边转过来,对这个不是很熟,谢谢,能给个例子吗
sundayX 2012-05-28
  • 打赏
  • 举报
回复
汗,谁说改成DataGridColumnHeader就能取到了。

法1:扩展DataGridColumnHeader,添加BorderWith属性,然后在style里将Border的width与该属性绑定, Width="{TemplatedBinding BorderWidth}"
法2:使用VisualTreeHelper尝试一下,前提是你能取到DataGridColumnHeader的对象。
法3:你的这个style应该不是DataGridColumnHeader的原来的style吧。DataGridColumnHeader的宽度应该是自适应DataGridColumn的宽度,通过设置DataGridColumn的宽度来解决。

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧