2013-08-22 1 views
1

Xaml 파일의 MahApps.Metro와 함께 StaticResources와 함께 제공되는 ModernUIIcons를 사용하고 있습니다. 내 UI에 1 점을 추가하는 듯하는 것은 다음과 같이 매우 간단합니다 :WPF StaticResource로 사각형을 캡슐화하여 WPF의 CustomControl에 채우기

<Rectangle Width="19" 
      Height="19"> 
    <Rectangle.Fill> 
     <VisualBrush Visual="{StaticResource appbar_database}" /> 
    </Rectangle.Fill> 
</Rectangle> 

나는 그래서 다음과 같이 할 수있는 CustomControl에 사각형의 모든 로직을 캡슐화 할 :

<cc:MenuItemIcon Source="{StaticResource appbar_page}"/> 

을/도서관, 테마 등

하나에서 프로젝트 generic.xaml을 : 이것은 내가 지금까지 가지고 무엇

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:AMIGEDM.CustomControls.Menu"> 

<Style TargetType="{x:Type local:MenuItemIcon}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MenuItemIcon}"> 
       <Rectangle Width="19" 
          Height="19"> 
        <Rectangle.Fill> 
         <VisualBrush Visual="{TemplateBinding Source}" /> 
        </Rectangle.Fill> 
       </Rectangle> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
</ResourceDictionary> 
01 23,516,

그리고 CS 파일에

namespace AMIGEDM.CustomControls.Menu 
{ 
    public class MenuItemIcon : Control 
{ 
    static MenuItemIcon() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MenuItemIcon), new FrameworkPropertyMetadata(typeof(MenuItemIcon))); 
    } 

    public static readonly DependencyProperty SourceProperty = 
     DependencyProperty.Register("Source", typeof(Visual), typeof(MenuItemIcon)); 

    public Visual Source 
    { 
     get { return (Visual)GetValue(SourceProperty); } 
     set { SetValue(SourceProperty, value); } 
    } 
    } 
} 

모든 부드러운 실크 컴파일, 그래서

<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> 
도서관은 사각형을 사용하여 아이콘을두고

, 사각형 채우기 내 TestDummy 프로젝트로 이동 VisualBrush,하지만 CustomControl을 사용하려고하면 아무 것도 표시되지 않습니다.

As you see, the icon appears using the complete rectangle but not with my custom control

+0

을 나는 여기 VS가 없습니다 그것을 확인하지만, 이것을 시도하십시오 : Eyjafjallajokull

+0

@Eyjafjallajokull 감사하지만 아이콘 크기를 조정해야합니다. XAML에서 올바르게 이해하면 – Claudiordgz

+0

소스 = "{StaticResource appbar_page}는 사각형이며 Visual ="{StaticResource appbar_database} "아이콘이됩니다.즉, 직사각형에 키를 지정하고 사용자 정의 컨트롤을 사용하는 대신 메뉴 항목의 아이콘으로 설정하는 것입니다. 올바른 방법으로 표시되었지만 리소스를 사용하는 두 번째 메뉴에서도 마찬가지입니다. – Eyjafjallajokull

답변

1

MenuItemIcon의 스타일을 제외한 모든 코드는 정상적으로 보입니다. 견적에 대한 TemplateBinding 아담 나단의 책 : 당신도 템플릿의 트리거 내에서 TemplateBinding을 사용할 수 있도록

TemplateBinding은 템플릿 외부 또는 VisualTree 속성을 외부에서 작동하지 않습니다. 또한 Freezable에 적용하면 TemplateBinding이 작동하지 않습니다 (대부분 인위적인 이유로). MSDN에서

그리고 견적에 대한 VisualBrush :

은 Freezable 기능 :가 된 Freezable 클래스에서 상속 때문에, 비주얼 클래스는 몇 가지 특수 기능을 제공합니다 : 비주얼 개체는 자원으로 선언하고 여러 개체간에 공유 할 수 .

따라서 대신 :

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

를 사용하여 건설 {RelativeSource TemplatedParent} 및 값이 검색하려는 종속성 속성에 해당하는 Path :

<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>