2016-10-13 8 views
0

WPFでは、実行時に動的にメニュー項目を作成しています。プログラムでアイコンサイズを設定する

ResourceDictionaryに格納されているStreamGeometryからアイコンを設定します。すべて正常に動作しますが、アイコンのサイズはどのように設定しますか?

MenuItem menExit = new MenuItem(); 
menExit.Header = "Exit"; // will be changedlater 
menExit.Command = UICommands.CmdExit; 
menExit.CommandBindings.Add(new CommandBinding(UICommands.CmdExit, CmdExitExecute, CmdExitCanExecute)); 
menExit.Icon = (StreamGeometry)FindResource("ImgExit"); 

//SET THE SIZE HERE???????? 
// Eventually, how do I set the fill color? 

menu.Items.Add(menExit); 

注、私は、実行時にこのすべてをやっているとxalm

+0

アイコンは、私はMenuItemのスタイルがあることを思わせるようあなたが直接ジオメトリを設定することができるという事実を。そのStyleで可能なPathコントロールを見て、そのサイズを設定してください。 – Clemens

答えて

2

に私はあなたがHeightWidthFillを指定してのDataとしてあなたStreamGeometryを設定できるのパスを作成することをお勧めではありませんパス。次にPathMenuItemのアイコンにします。

var path = new Path 
{ 
    Height = 20, 
    Width = 20, 
    Fill = new SolidColorBrush(Colors.Blue), 
    Data = (StreamGeometry) FindResource("ImgExit") 
}; 
menExit.Icon = path; 
+0

Thnx!私はこれを試してみる。興味深い。 –

+0

私はこのようにアイコンを見ていない。それが左か上のポジションが外れているかもしれませんか?データが正しく設定されています。 –

+0

追加する必要があるのは: path.Stretch = Stretch.Fill; –

0

あなたはいつもこれを試すことができます。

/// <summary> 
/// Convert Geometry to ImageSource, Draws the Geometry on a bitmap surface and centers it. 
/// </summary> 
/// <param name="geometry"></param> 
/// <param name="TargetSize"></param> 
/// <returns></returns> 
ImageSource Geometry_To_ImageSource(Geometry geometry, int TargetSize) 
{ 
    var rect = geometry.GetRenderBounds(new Pen(Brushes.Black, 0)); 

    var bigger = rect.Width > rect.Height ? rect.Width : rect.Height; 
    var scale = TargetSize/bigger; 

    Geometry scaledGeometry = Geometry.Combine(geometry, geometry, GeometryCombineMode.Intersect, new ScaleTransform(scale, scale)); 
    rect = scaledGeometry.GetRenderBounds(new Pen(Brushes.Black, 0)); 

    Geometry transformedGeometry = Geometry.Combine(scaledGeometry, scaledGeometry, GeometryCombineMode.Intersect, new TranslateTransform(((TargetSize - rect.Width)/2) - rect.Left, ((TargetSize - rect.Height)/2) - rect.Top)); 

    RenderTargetBitmap bmp = new RenderTargetBitmap(TargetSize, TargetSize, 96, 96, PixelFormats.Pbgra32); 

    DrawingVisual viz = new DrawingVisual(); 
    using (DrawingContext dc = viz.RenderOpen()) 
    { 
     dc.DrawGeometry(Brushes.Black, null, transformedGeometry); 
    } 

    bmp.Render(viz); 

    var mem = new MemoryStream(); 
    PngBitmapEncoder pngEncoder = new PngBitmapEncoder(); 
    pngEncoder.Frames.Add(BitmapFrame.Create(bmp)); 
    pngEncoder.Save(mem); 
    var itm = GetImg(mem); 
    return itm; 
} 

BitmapImage GetImg(MemoryStream ms) 
{ 
    var bmp = new BitmapImage();  
    bmp.BeginInit(); 
    bmp.StreamSource = ms; 
    bmp.EndInit(); 

    return bmp; 
} 
関連する問題