2012-03-28 12 views
0

Ich muss meine WPF-Anwendung, die eine hat, konvertieren, um Vektorgrafiken für die Bilder auf Schaltflächen usw. anstelle von Bitmaps zu verwenden. Ich habe das funktioniert so weit, außer für die RibbonApplicationMenu Artikel, die ihre RibbonApplicationMenu.ImageSource Eigenschaft verwenden, mit dem Typ ImageSource, um die Grafik, die auf der linken Seite des Menüband-Menüpunkts angezeigt wird.Wie kann ich Vektorgrafik (in XAML definiert) als Bild eines Ribbon-Menüelements verwenden?

Meine Vektorgrafik werden, wie dies in XAML definiert:

<ControlTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ViewBox Width="148.854" Height="150.500"> 
     <Canvas Width="148.854" Height="150.500"> 
      <Path> 
      <!-- . . . yadda yadda yadda . . . --> 
      </Path> 
     </Canvas> 
    <Viewbox> 
</ControlTemplate> 

Diese richtig machen, wenn ich sie setze die .Template ein Button usw.

ich jedoch herausfinden kann nicht sein, , wie man sie für die Bilder verwendet, die in den RibbonApplicationMenu Kontrollen angezeigt werden. Nur das Setzen der .Template Eigenschaft der RibbonApplicationMenu funktioniert nicht (es füllt die gesamte Kontrolle scheint seine Funktionalität zu brechen).

ich versuchte, ein VisualBrush zu verwenden und es dann zu einem RenderTargetBitmap machen als das verwenden .ImageSource (Ich muß auch in ich nicht hinter Gründen meist in Code arbeiten):

ContentControl cc = new ContentControl(); // just picked ContentControl as a test 
cc.Template = myTemplate; // assume myTemplate has the proper ControlTemplate 
VisualBrush visBrush = new VisualBrush(); 
visBrush.Visual = cc; 
// not really sure about the parameters to this next line 
RenderTargetBitmap rend = 
    new RenderTargetBitmap(148.854, 150.5, 120, 96, PixelFormats.Pbgra32); 
rend.Render(cc); 
RibbonApplicationMenuItem menu = new RibbonApplicationMenuItem(); 
menu.ImageSource = render; 

Diese kompiliert, zeigt aber nur ein Leerzeichen, wohin das Bild gehen würde. Wenn ich stattdessen BitmapImage verwende, das von einer Bilddatei als .ImageSource geladen wird, wird es richtig angezeigt.

Irgendwelche Ideen, wie ich das zur Arbeit bringen kann?

Antwort

0

Zwei Dinge, die getan werden könnte, müssen: Erstens gibt es keine explizite Größe festgelegt für die Canvas im ControlTemplate, Sie werden es eine Breite und Höhe zuweisen müssen (siehe the upvoted answer here für Details). Die andere Sache ist, dass Sie Arrange und Measure die Viewbox benötigen, so dass es die erforderlichen Abmessungen annimmt.

So XAML für die Vektor verändern Grafiken zu so etwas wie:

<ControlTemplate x:Key="Template"> 
    <Viewbox> 
     <Canvas Height="100" Width="130"> 
      <Path> 
       <!-- data --> 
      </Path> 
     </Canvas> 
    </Viewbox> 
</ControlTemplate> 

Und den Code:

ControlTemplate controlTemplate = 
    FindResource("Template") as ControlTemplate; 

ContentControl content = new ContentControl(); 
content.Template = controlTemplate; 

// ensure control has dimensions 
content.Measure(new Size(200, 200)); 
content.Arrange(new Rect(0, 0, 200, 200)); 

RenderTargetBitmap render = 
    new RenderTargetBitmap((int)content.ActualWidth, (int)content.ActualHeight, 120, 96, PixelFormats.Pbgra32); 

render.Render(content); 

RibbonApplicationMenuItem menu = new RibbonApplicationMenuItem(); 
menu.ImageSource = render; 

Wird es hoffentlich bekommen arbeiten.

+0

Entschuldigung, ich hätte mehr Details in meinen Code oben enthalten sollen. Ich habe eine Größe für die Leinwand (und ich habe diese Attribute in meiner Frage bearbeitet). Ich werde versuchen, so schnell wie möglich zu messen und zu ordnen. – Pysul

+0

Mit '.Measure' und' .Arrange' wurde das Ding im Ribbon angezeigt. Ich bin mir nicht sicher, ob es genau das ist, was ich brauche, aber es hat funktioniert. Es ist zwar nicht richtig aufgereiht, aber ich kann wahrscheinlich damit herumspielen. – Pysul