'Fill'属性不指向路径'(0)中的dependencyobject。(1)'

时间:2018-06-18 10:57:23

标签: c# wpf templates

我有一个控件模板(它是DevExpress NavBarGroup的标题组件 - 为了更改DevExpress所需的展开/折叠图标,以覆盖整个控件模板),里面有一个按钮,自己的控件模板,然后包含一个内容控件,指向另一个控件模板,里面有路径。有点像伪Xaml:

<NavBarGroupHeader>
  <ExplorerBarExpandButton>
    <Path>
      <SolidColorBrush/>
    </Path>
  </ExplorerBarExpandButton>
</NavBarGroupHeader>

现在,发生了各种各样的事情。 NavBarGroupHeader的最外层模板包含有问题的动画逻辑:标题一旦悬停,Path的填充颜色就会发生变化。实际上有两个按钮取决于使用相同逻辑和外观的NavBarGroupHeader的状态,这就是我将其外包到模板中的原因。 NavBarGroupHeader可以与ExplorerBarViewNavPaneView一起使用,然后激活其中的任意一个按钮(在这种情况下使用ExplorerBarExpandButtonNavPaneExpandButton被忽略了 - 但它仍然存在且可行。)

<ControlTemplate TargetType="{x:Type dxn:NavBarGroupHeader}>
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition/>
      <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinition>

    <VisualStateManager.VisualStateGroups>
      <VisualStateGroup x:Name="Common">
        <VisualState x:Name="Normal"/>
        <VisualState x:Name="MouseOver">
          <Storyboard>
            <!-- these two lines throw the exception -->
            <ColorAnimation Storyboard.Target="{Binding ElementName=ArrowTop}" Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)" Duration="0" To="#201F35"/>
            <ColorAnimation Storyboard.Target="{Binding ElementName=ArrowBottom}" Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)" Duration="0" To="#201F35"/>
          </Storyboard>
        </VisualState>
      </VisualStateGroup>
    </VisualStateManager.VisualStateGroup>

    <!-- This shows a text within the header -->
    <dxn:ImageAndTextContentPresenter/>

    <dxn:ExplorerBarExpandButton x:Name="ExplorerBarExpandButton"
                                 Grid.Column="1"
                                 Template="{StaticResource GroupBoxExpandButtonTemplate}"/>

    <dxn:NavPaneExpandButton x:Name="NavPaneExpandButton"
                             Grid.Column="1"
                             Template="{StaticResource GroupBoxExpandButtonTemplate}"/>
  </Grid>
</ControlTemplate>

ExplorerBarExpandButton包含两个图标,看起来相同,但其中一个图标上下颠倒了一个LayoutTransform,这就是为什么我将路径外包到自己的模板中。它还包含显示和隐藏任一按钮的逻辑,具体取决于NavBarGroup是展开还是折叠,如果单击标题会更改(这是由DevExpress预先确定并正常工作)。

<ControlTemplate x:Key="GroupBoxExpandButtonTemplate">
  <Grid>
    <VisualStateManager.VisualStateGroups>
      <VisualStateGroup x:Name="CommonStates">
        <VisualState x:Name="Normal"/>
      </VisualStateGroup>
      <VisualStateGroup x:Name="ExpandStates">
        <VisualState x:Name="Expanded"/>
        <VisualState x:Name="Collapsed">
          <Storyboard>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GlyphClose" Storyboard.TargetProperty="(Control.Visibility)" dxcn:ValueSetter.Visibility="Collapsed"/>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GlyphOpen" Storyboard.TargetProperty="(Control.Visibility)" dxcn:ValueSetter.Visibility="Visible"/>
          </Storyboard>
        </VisualState>
      </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>

    <ContentControl x:Name="GlyphClose"
                    Template="{StaticResource CollapseExpandIconTemplate}"/>
    <ContentControl x:Name="GlyphOpen"
                    Template="{StaticResource CollapseExpandIconTemplate}">
      <ContentControl.LayoutTransform>
        <RotateTransform Angle="180"/>
      </ContentControl.LayoutTransform>
    </ContentControl>
  </Grid>
</ControlTemplate>

路径实际上是一个StackPanel,里面有两个Paths(两个箭头指向同一个方向)。因此,我实际上想要使用DynamicResource颜色,但经过几个小时的尝试和搜索,我偶然发现了this post,解释说无法从故事板中访问目标元素内的资源。所以,现在我离开了:

<ControlTemplate x:Key="CollapseExpandIconTemplate">
  <StackPanel>
    <Path x:Name="ArrowTop" Stretch="Uniform" Fill="#80838F" Data="M 0,50 25,50 50,30 75,50 100,50 100,40 50,0 0,40 Z"/>
    <Path x:Name="ArrowBottom" Stretch="Uniform" Fill="#80838F" Data="M 0,50 25,50 50,30 75,50 100,50 100,40 50,0 0,40 Z"/>
  </StackPanel>
</ControlTemplate>

在其他多个帖子中(实际上每个人都有关于此错误)我已经读过路径中SolidColorBrush的声明丢失,但添加它并没有改变任何东西。我仍然得到同样的错误:

</Path ...>
  <Path.Fill>
    <SolidColorBrush Color="#80838F"/>
  </Path.Fill>
</Path>

我也尝试过在任何地方使用动态资源,但它显示了相同的异常。我尝试使用DoubleAnimation用于不同的颜色部分,但是会引发另一个异常(在R周围有和没有括号):

  

无法解析属性路径'(0)。(1)。(R)'中的所有属性引用。验证适用的对象是否支持属性。

我试图改变路径,因为我不确定它是否真的正确但没有任何效果。

现在我没有想法。如何让这个故事板工作?

修改

我尝试了另一件事,将Xaml简化为最简单的基础,消除所有重复元素并将所有模板合并在一起而不使用任何资源,从最外层元素更改背景颜色,然后一步一步到最里面直到我已经到达路径的模板,然后将模板移回资源。

这是Xaml的结果:

<ControlTemplate TargetType="{x:Type dxn:NavBarGroupHeader}>
  <Grid x:Name="HeaderRoot">
    <Grid.Background>
      <SolidColorBrush Color="White"/>
    </Grid.Background>

    <Grid.ColumnDefinitions>
      <ColumnDefinition/>
      <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinition>

    <VisualStateManager.VisualStateGroups>
      <VisualStateGroup x:Name="Common">
        <VisualState x:Name="Normal"/>
        <VisualState x:Name="MouseOver">
          <Storyboard>
            <ColorAnimation Storyboard.Target="{Binding ElementName=HeaderRoot}" Storyboard.TargetProperty="(Grid.Background).(SolidColorBrush.Color)" Duration="0" To="#201F35"/>
          </Storyboard>
        </VisualState>
      </VisualStateGroup>
    </VisualStateManager.VisualStateGroup>

    <!-- This shows a text within the header -->
    <dxn:ImageAndTextContentPresenter/>

    <dxn:ExplorerBarExpandButton x:Name="ExplorerBarExpandButton"
                                 Grid.Column="1">
      <dxn:ExplorerBarExpandButton.Template>
        <ControlTemplate x:Key="GroupBoxExpandButtonTemplate">
          <Grid x:Name="ExpandButtonRoot">
            <Grid.Background>
              <SolidColorBrush Color="White"/>
            </Grid.Background>

            <VisualStateManager.VisualStateGroups>
              <VisualStateGroup x:Name="CommonStates">
                <VisualState x:Name="Normal"/>
              </VisualStateGroup>
              <VisualStateGroup x:Name="ExpandStates">
                <VisualState x:Name="Expanded"/>
                <VisualState x:Name="Collapsed">
                  <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GlyphClose" Storyboard.TargetProperty="(Control.Visibility)" dxcn:ValueSetter.Visibility="Collapsed"/>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GlyphOpen" Storyboard.TargetProperty="(Control.Visibility)" dxcn:ValueSetter.Visibility="Visible"/>
                  </Storyboard>
                </VisualState>
              </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>

            <ContentControl x:Name="GlyphClose">
              <ContentControl.Template>
                <ControlTemplate>
                  <StackPanel x:Name="PathRoot">
                    <Path x:Name="ArrowBottom" Stretch="Uniform" Fill="#80838F" Data="M 0,50 25,50 50,30 75,50 100,50 100,40 50,0 0,40 Z"/>
                  </StackPanel>
                </ControlTemplate>
              </ContentControl.Template>
            </ContentControl>
          </Grid>
        </ControlTemplate>
      </dxn:ExplorerBarExpandButton.Template>
    </dxn:ExplorerBarExpandButton>
  </Grid>
</ControlTemplate>

在这种情况下,没有抛出异常,第一部分工作正常。当我将鼠标悬停在其上时,整个标题背景会发生变化。然后我把线改为:

<ColorAnimation Storyboard.Target="{Binding ElementName=ExpandButtonRoot}" Storyboard.TargetProperty="(Grid.Background).(SolidColorBrush.Color)" Duration="0" To="#201F35"/>

奇怪的是,整个标题背景在悬停在它上面时仍然会改变,而不仅仅是按钮的背景。我不知道这里发生了什么。

0 个答案:

没有答案