none
关于修改模板赋值的问题 RRS feed

  • 问题

  • 这是我模板里的代码

      <ControlTemplate TargetType="{x:Type Button}">
       <Rectangle x:Name="Normal" Stroke="LimeGreen" StrokeThickness="1"> <Rectangle.Fill> 
       <ImageBrush x:Name="Normal1" ImageSource="Close.png" Viewbox="0,0,0.26,1" ViewboxUnits="RelativeToBoundingBox" /> 
    </Rectangle.Fill> 
    </Rectangle>
         <ControlTemplate.Triggers>
          <Trigger Property="IsMouseOver" Value="True">
           <Setter TargetName="Normal" Property="ImageBrush.Viewbox" Value="0,0,0.26,1"/>
          </Trigger>
          <Trigger Property="IsPressed" Value="True">
           <Setter TargetName="Normal" Property="ImageBrush.Viewbox" Value="0.25,0,0.26,1"/>
          </Trigger>
         </ControlTemplate.Triggers>
        </ControlTemplate>
       </Button.Template>
    
    我的问题是:这样给ImageBrush里面的属性赋值对吗?<Setter TargetName="Normal" Property="ImageBrush.Viewbox" Value="0.25,0,0.26,1"/>
    
    
    2011年5月9日 7:31

答案

  • 你好,

    那么这个Setter在语法上是有错误的。一个Setter只能给指定的对象的某个Dependency Property赋值。你使用的是类似Animation里的语法。他们的区别是Setter.Property属性的类型是DependencyProperty, 而Storyboard.TargetProperty属性的类型的PropertyPath. 在Animation里是可以向像在数据绑定中那样解析一个属性路径的,但是Setter并不可以实现这样的功能。

    同时,ImageBrush.Viewbox并不是一个可继承的附加属性。你无法通过给Rectangle赋值来使得ImageBrush来继承这个属性。

     

    你可以使用Animation来解决这个问题。 下面是一个简单的例子。

            <ControlTemplate TargetType="{x:Type Button}">
              <Rectangle Height="50" Width="100" x:Name="Normal" Stroke="LimeGreen" StrokeThickness="1">
                <Rectangle.Fill>
                  <ImageBrush x:Name="Normal1" ImageSource="Images\Desert.jpg" Viewbox="0,0,0.26,1" ViewboxUnits="RelativeToBoundingBox" />
                </Rectangle.Fill>
              </Rectangle>
              <ControlTemplate.Triggers>
                <Trigger Property="IsPressed" Value="True">
                  <Trigger.EnterActions>
                    <BeginStoryboard Name="sbPressed">
                      <Storyboard>
                        <RectAnimation Storyboard.TargetName="Normal" 
                                Storyboard.TargetProperty="Fill.Viewbox"
                                Duration="0:0:0"
                                To="0.25,0,0.26,1">
                        </RectAnimation>
                      </Storyboard>
                    </BeginStoryboard>
                  </Trigger.EnterActions>
                  <Trigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="sbPressed"/>
                  </Trigger.ExitActions>
                </Trigger>
              </ControlTemplate.Triggers>
            </ControlTemplate>
    

     

    有什么不清楚的地方可以告诉我。


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月12日 2:52
    版主
  • 你好, 我试了下你的例子. targetName改为Normal1 提示找不到Element..根据报错信息. 我猜想Set的查找方式应该是根据VisualTree 来找的.. ImageBrush为Border的Fill属性,不在VisualTree上 ..

    另外试了下 Min Zhu的方法, 是可行的..


    just another day.
    2011年5月12日 12:10

全部回复

  • 恩 自己顶一下,期待高手回答

    2011年5月9日 10:12
  • 没看出什么问题... 这样设没达到预期效果?


    just another day.
    2011年5月9日 10:51
  • 没有达到啊,可能就是修改值那一步出错了,不知道怎么改

    2011年5月9日 15:42
  •  <Setter TargetName="Normal" Property="ImageBrush.Viewbox" Value="0.25,0,0.26,1" />

    这里TargetName写的是Normal , 按理解应该是Normal1  笔误?少了个1?

    just another day.
    2011年5月9日 15:58
  • ztx_lingdu你好,

    我觉得问题应该就是如KA_KA07所说的那样是笔误吧?

    我把他标记为答案了,如果你有什么补充的请尽管说哦。


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月11日 7:21
    版主
  • 不是笔误的问题,如果是这问题,我自己早就解决了,在别的论坛上,有高人说无法获取到FIll里面的内容,只能重写Fill里面的内容,我现在想知道有没有更好的办法

    2011年5月12日 1:24
  • 你好,

    那么这个Setter在语法上是有错误的。一个Setter只能给指定的对象的某个Dependency Property赋值。你使用的是类似Animation里的语法。他们的区别是Setter.Property属性的类型是DependencyProperty, 而Storyboard.TargetProperty属性的类型的PropertyPath. 在Animation里是可以向像在数据绑定中那样解析一个属性路径的,但是Setter并不可以实现这样的功能。

    同时,ImageBrush.Viewbox并不是一个可继承的附加属性。你无法通过给Rectangle赋值来使得ImageBrush来继承这个属性。

     

    你可以使用Animation来解决这个问题。 下面是一个简单的例子。

            <ControlTemplate TargetType="{x:Type Button}">
              <Rectangle Height="50" Width="100" x:Name="Normal" Stroke="LimeGreen" StrokeThickness="1">
                <Rectangle.Fill>
                  <ImageBrush x:Name="Normal1" ImageSource="Images\Desert.jpg" Viewbox="0,0,0.26,1" ViewboxUnits="RelativeToBoundingBox" />
                </Rectangle.Fill>
              </Rectangle>
              <ControlTemplate.Triggers>
                <Trigger Property="IsPressed" Value="True">
                  <Trigger.EnterActions>
                    <BeginStoryboard Name="sbPressed">
                      <Storyboard>
                        <RectAnimation Storyboard.TargetName="Normal" 
                                Storyboard.TargetProperty="Fill.Viewbox"
                                Duration="0:0:0"
                                To="0.25,0,0.26,1">
                        </RectAnimation>
                      </Storyboard>
                    </BeginStoryboard>
                  </Trigger.EnterActions>
                  <Trigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="sbPressed"/>
                  </Trigger.ExitActions>
                </Trigger>
              </ControlTemplate.Triggers>
            </ControlTemplate>
    

     

    有什么不清楚的地方可以告诉我。


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月12日 2:52
    版主
  • 你好, 我试了下你的例子. targetName改为Normal1 提示找不到Element..根据报错信息. 我猜想Set的查找方式应该是根据VisualTree 来找的.. ImageBrush为Border的Fill属性,不在VisualTree上 ..

    另外试了下 Min Zhu的方法, 是可行的..


    just another day.
    2011年5月12日 12:10