2014-09-20 47 views
1

我必须使用以下方法从资源字典中使用指定的程序集和相对URI检索对象Canvas,并将Canvas绑定到MenuItem s Icon。此代码,以获得矢量图形Canvas正确绑定到画布对象的大小图标

public Canvas GetVectorGraphic(string assemblyName, string relativeUri, string name) 
{ 
    var imageResourceDictionary = new ResourceDictionary(); 
    imageResourceDictionary.Source = 
     new Uri(assemblyName + ";component/" + relativeUri, UriKind.Relative) 
      ?? new Uri(relativeUri, UriKind.Relative); 
    if (imageResourceDictionary.Source == null) 
     return default(Canvas); 
    return imageResourceDictionary[name] as Canvas; 
} 

MenuItem绑定是

<Style x:Key="MenuItem" TargetType="{x:Type Controls:MenuItemEx}"> 
    <Setter Property="Icon"> 
     <Setter.Value> 
      <Image Source="{Binding IconSource}" Width="16" Height="16"/> 
     </Setter.Value> 
    </Setter> 
    ... 

我也试图

<Setter Property="Icon"> 
    <Setter.Value> 
     <Rectangle Width="16" Height="16"> 
      <Rectangle.Fill> 
       <VisualBrush Stretch="Uniform" 
          Visual="{Binding IconSource}"/> 
      </Rectangle.Fill> 
     </Rectangle> 
    </Setter.Value> 
</Setter> 

你可以看到,我都在尝试将高度在Canvas到16 x 16直接,也通过恢复填充大小的矩形,但这是失败 - 它只是导致一个空白图像。如果我忽略了HeightWidth规范,则生成的图形太大。

我也试图调整Canvas当我通过

... 
Canvas c = imageResourceDictionary[name] as Canvas; 
c.Height = 16; 
c.Width = 16; 
return c; 

从词典阅读但这会造成图像消失。

如何正确调整我的Canvas对象以适合我的MenuItem


编辑(部分答案):

我来翻过很多很多帖子,但没有就解决所有我在一个岗位有问题。问题:

  1. 未使用矢量图形显示任何图像。 [已解决]
  2. 获取图像显示但未正确缩放。 [求助]
  3. 获取缩放和显示的图像,但一次只能显示一个。 [求助]
  4. 图像被缩放并显示所有需要的MenuItems,但知道顶级菜单项有一个不需要的余量。 [ON GOING]

我如何解决所有,但最后一个问题是1.使用正确的图像源矢量图形,在这种情况下,我发现填充矩形做了这项工作。 2.您可以直接绑定到Icon对象来获取图像,但是没有真正的适当缩放这些图像的方法。 3.您可以通过使用矩形缩放图像,设置为WidthHeight并填充为VisualBrush,但这会在MenuItems之间分配资源,因此只有一个会显示出来。要使图标不共享,您必须创建一个静态资源并设置x:Shared="False"。最终的XAML看起来像

<Rectangle x:Key="MenuItemIcon" x:Shared="False" 
      HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      Width="16" Height="16"> 
    <Rectangle.Fill> 
     <VisualBrush Stretch="Uniform" Visual="{Binding IconSource}"/> 
    </Rectangle.Fill> 
</Rectangle> 

<Style x:Key="MenuItem" TargetType="{x:Type Controls:MenuItemEx}"> 
    <Setter Property="Icon" Value="{StaticResource MenuItemIcon}"/> 
    <Setter Property="InputGestureText" Value="{Binding InputGestureText}"/> 
    <Setter Property="Caliburn:Action.Target" Value="{Binding}"/> 
    <Setter Property="Caliburn:Message.Attach" Value="{Binding ActionText}"/> 
</Style> 

突出问题

我现在已经在顶级项目也移动到右边的问题(如图中下方的红色箭头),因为矩形的尺寸是硬编码为16。然而,结合WitdhHeight似乎会导致图像再次消失......

Layout Problem

我现在要尝试到模板菜单项,并设置图标区域自动合拢。任何其他的解决方案,欢迎...

+0

看看[此触发(http://pastebin.com/iM6agQ6j)在菜单项的风格帮你崩溃的空白。 – pushpraj 2014-09-21 12:20:41

回答

1

两个主要问题是如果图标未包含在外部静态容器中,则共享图标(请参阅编辑提问)。我得到了这一切到底的工作方式是使用下面的XAML:

<Rectangle x:Key="MenuItemIcon" x:Shared="False" 
      Visibility="{Binding IconVisibility}" 
      HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      Width="16" Height="16"> 
    <Rectangle.Fill> 
     <VisualBrush Stretch="Uniform" Visual="{Binding IconSource}"/> 
    </Rectangle.Fill> 
</Rectangle> 

<Style x:Key="MenuItem" TargetType="{x:Type Controls:MenuItemEx}"> 
    <Setter Property="Icon" Value="{StaticResource MenuItemIcon}"/> 
    <Setter Property="InputGestureText" Value="{Binding InputGestureText}"/> 
    <Setter Property="Caliburn:Action.Target" Value="{Binding}"/> 
    <Setter Property="Caliburn:Message.Attach" Value="{Binding ActionText}"/> 
</Style> 

MainMenuIcon的默认Visibility设置为Visibility.Collapsed。这提供了以下菜单看...

Look

1

Viewbox可以很容易地通过缩放内容,可用大小照顾这样的事情

所以去除图像尺寸和图像将视框

例如内

<Setter Property="Icon"> 
    <Setter.Value> 
     <Viewbox> 
      <Image Source="{Binding IconSource}" /> 
     </Viewbox> 
    </Setter.Value> 
</Setter> 

,如果你想限制可用的大小,你也许应用规模上Viewbox控件

例如

<Viewbox Width="16" Height="16"> 

MSDN: Viewbox

视框限定了内容装饰器可以伸展和扩展单个子以填充可用空间。

+0

谢谢,但这也可以。图像就消失了。我使用Snoop,我可以看到发生了什么,并通过Snoop设置适当的属性,我可以正确地扩展它。基本上,如果我设置Canvas大小,但Snoop中的底层UI元素(显示为“(Path)”)仍然具有32.111999的大小。如果我进入(Path)并改变'Left = 0,Top = 0'和'Width = 16,Height = 16',它看起来很好看,但我可以使用'canvas.Children访问底层路径属性[0] .Height'它是受保护的... – MoonKnight 2014-09-20 15:29:41

+0

@ Killercam,你的图标(画布)需要有尺寸(正确渲染的图标的原始大小),否则它被视为0高度和宽度和缩放/拉伸0尺寸不起作用。您也可以尝试将其定义为'' – pushpraj 2014-09-20 15:44:24

+0

再次,这似乎不起作用。今天我会进一步调查...... – MoonKnight 2014-09-21 09:45:57