C# WPF使用StaticResource将矩形封装为WPF中的CustomControl的填充

C# WPF使用StaticResource将矩形封装为WPF中的CustomControl的填充,c#,wpf,xaml,wpf-controls,mahapps.metro,C#,Wpf,Xaml,Wpf Controls,Mahapps.metro,我使用Xaml文件中MahApps.Metro附带的Modernuicons作为静态资源。在我的UI中放置一个非常简单,如下所示: <Rectangle Width="19" Height="19"> <Rectangle.Fill> <VisualBrush Visual="{StaticResource appbar_database}" /> </Rectangle.Fill> </R

我使用Xaml文件中MahApps.Metro附带的Modernuicons作为静态资源。在我的UI中放置一个非常简单,如下所示:

<Rectangle  Width="19" 
            Height="19">
   <Rectangle.Fill>
      <VisualBrush Visual="{StaticResource appbar_database}" />
   </Rectangle.Fill>
</Rectangle>
一切编译都非常顺利,所以我开始我的TestDummy项目

<Window x:Class="AMIGEDM.TestDummy.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:cc="clr-namespace:AMIGEDM.CustomControls.Menu;assembly=AMIGEDM.CustomControls">
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/AMIGEDM.TestDummy;component/Resources/Icons.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/AMIGEDM.CustomControls;component/Themes/Generic.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <Menu IsMainMenu="True" SnapsToDevicePixels="True">
        <MenuItem Header="_Open">
            <MenuItem Header="_File">
                <MenuItem.Icon>
                    <cc:MenuItemIcon Source="{StaticResource appbar_page}"/>
                </MenuItem.Icon>
            </MenuItem>
            <MenuItem Header="_File">
                <MenuItem.Icon>
                    <Rectangle  Width="19" 
                            Height="19">
                        <Rectangle.Fill>
                            <VisualBrush Visual="{StaticResource appbar_database}" />
                        </Rectangle.Fill>
                    </Rectangle>
                </MenuItem.Icon>
            </MenuItem>
        </MenuItem>
    </Menu>
</Grid>

库使用矩形、矩形填充和VisualBrush放置图标,但当我尝试使用CustomControl时,它什么也不显示


除了
MenuItemIcon
的样式外,所有代码看起来都正常。引用Adam Nathan书中关于模板绑定的
TemplateBinding

TemplateBinding不能在模板外部或其VisualTree属性外部工作,因此您甚至不能在模板的触发器内部使用TemplateBinding。此外,, TemplateBinding在应用于Freezable时不起作用(主要是人为原因)

并引用关于VisualBrush的内容:

Freezable特性:由于它继承自Freezable类,VisualBrush类提供了几个特殊特性:VisualBrush对象可以声明为资源,并在多个对象之间共享

因此,不是:

<VisualBrush Visual="{TemplateBinding Source}" />

除了
MenuItemIcon
的样式外,所有代码看起来都正常。引用Adam Nathan书中关于模板绑定的
TemplateBinding

TemplateBinding不能在模板外部或其VisualTree属性外部工作,因此您甚至不能在模板的触发器内部使用TemplateBinding。此外,, TemplateBinding在应用于Freezable时不起作用(主要是人为原因)

并引用关于VisualBrush的内容:

Freezable特性:由于它继承自Freezable类,VisualBrush类提供了几个特殊特性:VisualBrush对象可以声明为资源,并在多个对象之间共享

因此,不是:

<VisualBrush Visual="{TemplateBinding Source}" />

我这里没有一个VS来检查它,但是试试这个:@Eyjafjallajokull谢谢,但是我需要调整图标的大小,这就是为什么我没有像那样直接使用它们的原因。Source=“{StaticResource appbar_page}是一个矩形,Visual=“{StaticResource appbar_database}”“是一个图标,如果我从您的XAML中正确理解的话。我的意思是给一个矩形设置键,并将其设置为菜单项的图标,而不是使用自定义控件-就像您在第二个菜单项中所做的那样,该菜单项以正确的方式显示,但使用资源。我这里没有VS来检查它,但请尝试以下操作:@Eyjafjallajokull谢谢,但我需要调整图标的大小,这就是为什么我不直接使用这些图标,就像Source=”{StaticResource appbar_page}是一个矩形,Visual=“{StaticResource appbar_database}”是一个图标,如果我从您的XAML中正确理解的话。我的意思是,将键指定给一个矩形,并将其设置为菜单项的图标,而不是使用自定义控件-就像您在第二个菜单项中所做的那样,该菜单项以正确的方式显示,但使用resource。
<Window x:Class="AMIGEDM.TestDummy.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:cc="clr-namespace:AMIGEDM.CustomControls.Menu;assembly=AMIGEDM.CustomControls">
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/AMIGEDM.TestDummy;component/Resources/Icons.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/AMIGEDM.CustomControls;component/Themes/Generic.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <Menu IsMainMenu="True" SnapsToDevicePixels="True">
        <MenuItem Header="_Open">
            <MenuItem Header="_File">
                <MenuItem.Icon>
                    <cc:MenuItemIcon Source="{StaticResource appbar_page}"/>
                </MenuItem.Icon>
            </MenuItem>
            <MenuItem Header="_File">
                <MenuItem.Icon>
                    <Rectangle  Width="19" 
                            Height="19">
                        <Rectangle.Fill>
                            <VisualBrush Visual="{StaticResource appbar_database}" />
                        </Rectangle.Fill>
                    </Rectangle>
                </MenuItem.Icon>
            </MenuItem>
        </MenuItem>
    </Menu>
</Grid>
<VisualBrush Visual="{TemplateBinding Source}" />
<Style TargetType="{x:Type local:MenuItemIcon}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MenuItemIcon}">
                <Rectangle Width="22" Height="22">
                    <Rectangle.Fill>
                        <VisualBrush Visual="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Source}" />                                
                    </Rectangle.Fill>
                </Rectangle>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>