正确绑定大小的图标到画布对象(Correctly Size Icon Bound to Canvas

2019-10-21 00:07发布

我不得不以下检索方法Canvas使用命名的组件和相对的URI从一个资源字典对象并结合所述CanvasMenuItem小号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×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 ,但这shars之间的资源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似乎会导致图像再次消失...

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

Answer 1:

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

所以从图像中去除的大小和图像放置视框内部

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

如果你想限制可用的大小,你也许适用于Viewbox控件的大小

例如

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

从MSDN:Viewbox控件

视框定义内容装饰,可以拉伸和缩放一个孩子以填充可用空间。



Answer 2:

两个主要的问题是,如果他们没有在外部静态容器里装的(见编辑质疑)该图标是共享的。 我得到了这一切到底的工作方式是使用下面的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>

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



文章来源: Correctly Size Icon Bound to Canvas Object