2016-10-13 3 views
0

WPF에서 런타임에 동적으로 메뉴 항목을 만듭니다.프로그래밍 방식으로 아이콘 크기 설정

ResourceDictionary에 저장된 StreamGeometry에서 아이콘을 설정합니다. 모든 것은 정상적으로 작동하지만 아이콘의 크기는 어떻게 설정합니까? 당신이 Height, WidthFill 및 설정을 지정할 수있는 경로를 만들

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

난 당신을 제안하지 귀하의 DataStreamGeometry 경로. 그런 다음 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; 
} 
관련 문제