2016-10-13 6 views
0

В WPF я динамически создаю элемент меню во время выполнения.Программная настройка размера значка

Я установил значок из StreamGeometry, который хранится в ResourceDictionary. Все работает нормально, но: как установить размер значка?

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

Тот факт, что вы можете непосредственно установить геометрию, как Icon заставляет меня думать, что есть MenuItem Style. Посмотрите на возможный элемент управления Path в этом стиле и установите его размер. – Clemens

ответ

2

Я предлагаю вам создать путь, на котором можно указать Height, Width и Fill и установить StreamGeometry как Data из путь. Затем поместите этот Path в качестве значка MenuItem.

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; 
} 
Смежные вопросы