2013-07-23 4 views
0

Я хотел бы сделать простой UserControl в WPF следующим образом: изображение (скажем, 128x128) с другим изображением на нем меньше (48x48). Назовем их imgMain и imgOverlay (маленький).Свойство изображения в usercontrol

Теперь я хочу разместить свой UserControl в любом приложении WPF и иметь возможность изменять изображения и их размер. Я добавил два свойства в свой usercontrol и был рад видеть, что они отображаются в правильной форме в дизайнере VS2010. Но когда я пытаюсь поместить изображение с помощью конструктора, элемент управления не обновляется и остается белым. То же самое, если я попытаюсь сделать это во время выполнения из кода.

Я прочитал несколько сообщений о DependencyProperties и всех (что-то, с чем я не очень хорошо знаком), но они всегда, похоже, хотят иметь больше логики даже при изменении изображения. Я хочу что-то действительно простое и просто визуальное.

Вот что я сделал для свойств:

  • размер наложения

    public Size OverlaySize 
    { 
        get 
        { 
         return new Size(imgOverlay.Width, imgOverlay.Height); 
        } 
        set 
        { 
         imgOverlay.Width = value.Width; 
         imgOverlay.Height = value.Height; 
        } 
    } 
    
  • изображения для основного и наложения

    public Image ImageMain 
    { 
        get 
        { 
         return imgMain; 
        } 
        set 
        { 
         imgMain = value; 
        } 
    } 
    
    public Image ImageOverlay 
    { 
        get 
        { 
         return imgOverlay; 
        } 
        set 
        { 
         imgOverlay = value; 
        } 
    } 
    

ответ

0

Вы действительно нужно идти и делать отверстие DependencyProperty танец. Извини за это. WPF представляет свою собственную систему событий, свою собственную систему собственности и заставляет вас использовать ее. Сначала я сбила с толку. А потом просто утомительно. Подождите ... Я посмотрю, смогу ли я выкопать какой-то подобный код для вас ...

OK. Этот маленький класс работает как элемент управления Image, который отображает различные изображения в зависимости от значения, связанного с ней ...

Код XAML:

<UserControl x:Class="DesignPerformanceViewer.Controls.BooleanImage" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <Image Name="image" Height="11" VerticalAlignment="Center" HorizontalAlignment="Center" SnapsToDevicePixels="True"/> 
    </Grid> 
</UserControl> 

И код позади со всем DependencyProperty танец .. .

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.ComponentModel; 

namespace DesignPerformanceViewer.Controls 
{ 
    /// <summary> 
    /// Interaction logic for BooleanImage.xaml 
    /// </summary> 
    public partial class BooleanImage : UserControl 
    { 
     private static readonly DependencyProperty TrueSourceProperty = DependencyProperty.Register("TrueSource", typeof(ImageSource), typeof(BooleanImage)); 
     private static readonly DependencyProperty TrueToolTipProperty = DependencyProperty.Register("TrueToolTip", typeof(string), typeof(BooleanImage)); 
     private static readonly DependencyProperty FalseSourceProperty = DependencyProperty.Register("FalseSource", typeof(ImageSource), typeof(BooleanImage)); 
     private static readonly DependencyProperty FalseToolTipProperty = DependencyProperty.Register("FalseToolTip", typeof(string), typeof(BooleanImage)); 
     private static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(bool), typeof(BooleanImage), 
      new PropertyMetadata(false, new PropertyChangedCallback(OnValuePropertyChanged), new CoerceValueCallback(OnValueCoerceValueCallback)), 
      new ValidateValueCallback(OnValueValidateValueCallback)); 

     public ImageSource TrueSource { get { return (ImageSource)GetValue(TrueSourceProperty); } 
      set 
      { 
       SetValue(TrueSourceProperty, value); 
      } 
     } 
     public ImageSource FalseSource { get { return (ImageSource)GetValue(FalseSourceProperty); } set { SetValue(FalseSourceProperty, value); } } 
     public string TrueToolTip { get { return (string)GetValue(TrueToolTipProperty); } set { SetValue(TrueToolTipProperty, value); } } 
     public string FalseToolTip { get { return (string)GetValue(FalseToolTipProperty); } set { SetValue(FalseToolTipProperty, value); } } 
     public bool Value 
     { 
      get { return (bool)GetValue(ValueProperty); } 
      set 
      { 
       SetValue(ValueProperty, value); 
      } 
     } 

     public BooleanImage() 
     { 
      InitializeComponent(); 
     } 

     private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      var self = (BooleanImage) d; 
      var newValue = (bool) e.NewValue; 
      self.image.Source = newValue ? self.TrueSource : self.FalseSource; 
      self.ToolTip = newValue ? self.TrueToolTip : self.FalseToolTip; 
     }  

     private static object OnValueCoerceValueCallback(DependencyObject d, object baseValue) 
     { 
      if (!(baseValue is bool)) 
      { 
       return false; 
      } 
      var boolValue = (bool) baseValue; 
      var self = (BooleanImage)d; 
      self.image.Source = boolValue ? self.TrueSource : self.FalseSource; 
      self.ToolTip = boolValue ? self.TrueToolTip : self.FalseToolTip; 
      return boolValue; 
     } 
     private static bool OnValueValidateValueCallback(object value) 
     { 
      return true; 
     } 
    } 
} 
+0

Спасибо большое; Действительно, это немного контрпродуктивно по сравнению с целью, которую я пытался достичь –

+0

@ MickaelV. Я не понимаю, что вы подразумеваете под «контрпродуктивным»: пример? Или шаблон разработки DependencyProperty? –

+0

Весь DependencyProperty. У меня только 3 изображения прямо сейчас, и я думал, что делать usercontrol (так, как я это сделал). МОЖЕТ быть полезным когда-нибудь. Но в свете этих новых элементов будет быстрее сделать это вручную для моих 3-х изображений и, возможно, попробовать свои силы на зависимых свойствах позже –