2011-04-08 5 views
9

다양한 Image을 으로 이동하기 시작했으며 내 WPF 응용 프로그램에서 이상한 동작을 발견했습니다. ImageMenuItem이고 ButtonToolBar 인 경우 Menu을 열면 Button에서 이미지가 사라집니다. Window에서메뉴가 열릴 때 XAML ResourceDictionary의 이미지가 도구 모음에서 사라짐

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Image x:Key="NewImage" 
      Source="/SomeApplication;component/Resources/NewDocumentHS.png" 
      Stretch="None"/> 
    <!-- ... --> 

관련 XAML은 :

<Menu> 
    <MenuItem Header="_File"> 
     <MenuItem Header="_New" 
        Command="{Binding NewCommand}" 
        Icon="{DynamicResource NewImage}" /> 
<!-- ... --> 
<ToolBarTray> 
    <ToolBar> 
     <Button Command="{Binding NewCommand}" 
       Content="{DynamicResource NewImage}" /> 

나는 이것이 ResourceDictionary에서 자원의주의 가정,하지만 난 이것에 대한 적절한 수정을 발견 할 수 없습니다입니다. 동작은 StaticResourceDynamicResource 모두 발생합니다. ResourceDictionary이 단독으로 존재하거나 다른 사람과 병합 된 경우에도 영향을받지 않습니다. 그 핵심 자원도 다른 자원과 공유하지 않습니다.

편집 : 또한 이미지에 PresentationOptions:Freeze="True"을 추가해도 상황이 변경되지 않았습니다.

+2

이것은 Silverlight 4의 경로 스타일을 사용한 제 경험과 비슷합니다. 런타임은 적용된 리소스의 첫 번째 인스턴스 만 렌더링 한 다음 모양이 (내 경우에는 벡터 아이콘 인) 공허한 곳에서 공허합니다. (해결 방법을 찾지 못했습니다 ... – dain

답변

7

Image 클래스는 시각적이므로 한 위치의 시각적 트리에만 나타날 수 있습니다. 따라서 여러 MenuItems/Buttons/등으로 공유 할 수 없습니다.

그러나 ImageSource (즉 Image.Source) 값을 공유 할 수 있습니다.

WPF에서는 x:Shared = "False"를 사용하여 각 요청에 대해 WPF가 새 인스턴스를 강제로 생성 할 수 있다고 생각합니다.

+0

이제 시각 ''x : Shared' 비트는 완전히 명백하지 않았습니다. 잘 작동합니다. 많은 감사합니다. – user7116

2

여러 위치에서 이미지 컨트롤을 사용할 수 없으며 Visual Tree에서만 한 위치에 표시 될 수 있으므로 리소스 호출이 이루어지면 이미지가 이전 소유자로부터 스낵되고있는 것입니다.

편집 :x:Shared="False" 분명히 아래에있는 내 제안의 모든보다 더 나은 솔루션, 나는 이러한 중요한 속성은 인텔리에 표시되지 않는 이유 -_-이 문제가 조금있다


궁금해 고통의, 나는 일반적으로 IconStyle 및 이미지의 소스에 대한 BitmapImages을 미리 정의하지만 모든 MenuItem에 대한 새 이미지를 만들 필요가 있습니다.

당신은 또한 당신의 아이콘에 대한 DataTemplate을을 만들 수 있습니다

:

자료 :

<Style x:Key="IconImageStyle" TargetType="{x:Type Image}"> 
     <Setter Property="MaxWidth" Value="16"/> 
     <Setter Property="MaxHeight" Value="16"/> 
    </Style> 
    <DataTemplate x:Key="Icon_Close_Template"> 
     <Image Style="{StaticResource IconImageStyle}" 
       Source="pack://application:,,,/Images/Close.ico"/> 
    </DataTemplate> 

사용법 : 템플릿이 작동 공장을 통해 생성되기 때문에

<Menu> 
    <MenuItem Header="File"> 
     <MenuItem Header="Close"> 
      <MenuItem.Icon> 
       <ContentPresenter ContentTemplate="{StaticResource Icon_Close_Template}"/> 
      </MenuItem.Icon> 
     </MenuItem> 
     <MenuItem Header="Close"> 
      <MenuItem.Icon> 
       <ContentPresenter ContentTemplate="{StaticResource Icon_Close_Template}"/> 
      </MenuItem.Icon> 
     </MenuItem> 
    </MenuItem> 
</Menu> 

여전히 크게 웃기 XAML ...

이 문제를 해결하려면 e 태그 확장을 쓰기 xample,이 매우 간단하고 유일한 복사본은 SourceStyle 속성 값은 또한 완전한 사본을 만들 반사 또는 다른 수단을 사용할 수

[MarkupExtensionReturnType(typeof(object))] 
public class IconExtension : MarkupExtension 
{ 
    private Image icon; 
    public Image Icon 
    { 
     get { return icon; } 
     set { icon = value; } 
    } 

    public IconExtension() { } 
    public IconExtension(Image icon) 
    { 
     Icon = icon; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (Icon == null) throw new ArgumentNullException("Icon"); 
     return new Image() { Source = Icon.Source, Style = Icon.Style }; 
    } 
} 

이 같은 기능을 :

<Style x:Key="IconImageStyle" TargetType="{x:Type Image}"> 
    <Setter Property="MaxWidth" Value="16"/> 
    <Setter Property="MaxHeight" Value="16"/> 
</Style> 
<Image x:Key="Icon_Close" Style="{StaticResource IconImageStyle}" Source="pack://application:,,,/Images/Close.ico"/> 
<!-- ... --> 
<MenuItem Header="File"> 
    <MenuItem Header="Close" Icon="{m:Icon {StaticResource Icon_Close}}"/> 
    <MenuItem Header="Close" Icon="{m:Icon {StaticResource Icon_Close}}"/> 
</MenuItem> 
관련 문제