Я бы предложил использовать свойства и привязки зависимостей при создании элемента управления. Преимуществ от этого будет много, например, вы сможете связать свойство Image для ImageButton
и не столкнетесь с проблемами, подобными той, которая задана в вашем вопросе.
Вместо использования установщика в Свойствах для установки источника изображения и текста TextBlock, вы можете привязать их к свойствам ImageButton
UserControl
.
Обновление
Я собрал небольшой пример проекта с ImageButton
здесь: http://www.mediafire.com/?vlk4m7svttyjd6t
Ваш Xaml может выглядеть так
<UserControl ...
x:Name="imageButton">
<Button...>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding ElementName=imageButton, Path=Image}" .../>
<TextBlock Text="{Binding ElementName=imageButton, Path=Text}" .../>
</StackPanel>
</Button>
</UserControl>
А затем вы заменяете свойства CLR свойствами зависимости, как показано ниже в коде
public partial class ImageButton : UserControl
{
public static readonly DependencyProperty ImageProperty =
DependencyProperty.Register("Image",
typeof(ImageSource),
typeof(ImageButton),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
public ImageSource Image
{
get { return (ImageSource)base.GetValue(ImageProperty); }
set { base.SetValue(ImageProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text",
typeof(string),
typeof(ImageButton),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
public string Text
{
get { return (string)base.GetValue(TextProperty); }
set { base.SetValue(TextProperty, value); }
}
//...
}
Для свойства Gap вы можете либо связать поле с конвертером, либо использовать PropertyChangedCallback
, чтобы установить его в коде позади.
Надеюсь, это поможет