2015-02-24 3 views
1

Я реализовал usercontrol с помощью простой функции call_click callback. Кроме того, я реализовал DP, который устанавливает StackPanel с изображением на контент кнопки. Когда я использую usercontrol без DP, button_click работает нормально, но когда я использую DP, функция call_click callback больше не вызывается ... Кто-нибудь знает, почему это так? и как это исправить? ** Я знаю, что могу реализовать настройки изображения во многих других отношениях, но я хочу, чтобы придерживаться этого метода (этот проект является лишь исследование для другого проекта) КонтрольUser control DP hide button_click

Пользователь XAML:

<UserControl x:Class="WpfApplication1.ButtonClick" 
      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> 
     <Button Width="50" Height="40" Background="Transparent" BorderThickness="0" BorderBrush="Transparent" Click="Button_Click"></Button> 
    </Grid> 
</UserControl> 

CS файл управления пользователя:

public partial class ButtonClick : UserControl 
    { 
     public static readonly DependencyProperty ShowImageDP = DependencyProperty.Register("ShowImage", typeof(string), typeof(ButtonClick), new PropertyMetadata(null, new PropertyChangedCallback(SetImage))); 

     private string  m_strSourceImage = string.Empty; 
     private BitmapImage m_oImage   = null; 


     public ButtonClick() 
     { 
      InitializeComponent(); 
     } 

     public string ShowImage 
     { 
      get 
      { 
       return (string)GetValue(ShowImageDP); 
      } 
      set 
      { 
       SetValue(ShowImageDP, value); 
      } 
     } 

     private static void SetImage(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
     { 
      //Amit: Recive the path string to the Image file. 
      ButtonClick l_oBC = (ButtonClick)obj; 
      l_oBC.m_strSourceImage = (string)args.NewValue; 
      //Amit: If the file exsit read it to BitmapImage. 
      if (File.Exists(l_oBC.m_strSourceImage)) 
      { 
       l_oBC.m_oImage = new BitmapImage(new Uri(l_oBC.m_strSourceImage, UriKind.Absolute)); 
      } 
      //Amit: Build an Image object out of the BitmapImage, set the image to a stack panle and set the panle to the button's content. 
      Image l_oImage = new Image(); 
      l_oImage.Source = l_oBC.m_oImage; 
      StackPanel l_oPanle = new StackPanel(); 
      l_oPanle.Orientation = Orientation.Horizontal; 
      l_oPanle.Children.Add(l_oImage); 
      l_oBC.Content = l_oPanle; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show("We just clicked!"); 
     } 
    } 

enter image description here enter image description here

+0

Пожалуйста, никогда не создает каких-либо 'UIElement' в коде. Это полностью против идеи WPF. Вместо этого используйте XAML, MVVM и триггеры. – dymanoid

ответ

1

проблема заключается в том что вы устанавливаете содержимое всего пользовательского контроля, а не только кнопку. Таким образом, кнопка полностью удаляется из окна.

Так что, если вы даете кнопку имя, как это:

<Button x:Name="btn" Width="50" Height="40"... 

.. вы должны быть в состоянии установить содержание в DP так:

l_oBC.btn.Content = l_oPanle; 
+0

Большое спасибо! Я не мог больше желать большего, как объяснения, так и решения. :) –