2014-09-20 54 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