Я использую следующий класс и DependencyProperty, чтобы стиль, чтобы установить изображение для кнопки:Кнопка Style работает во время выполнения, но Visual Studio показывает ошибку во время разработки
public static class ImageButton
{
public static readonly DependencyProperty ImageProperty =
DependencyProperty.RegisterAttached("Image", typeof(ImageSource), typeof(ImageButton),
new FrameworkPropertyMetadata((ImageSource)null));
public static ImageSource GetImage(DependencyObject obj)
{
return (ImageSource)obj.GetValue(ImageProperty);
}
public static void SetImage(DependencyObject obj, ImageSource value)
{
obj.SetValue(ImageProperty, value);
}
}
Я определил следующее Стиль (в ImageButton.xaml):
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vcontrols="clr-namespace:Vialis.Led.LedControl5.Controls">
<ControlTemplate x:Key="ImageButtonTemplate" TargetType="Button">
<Image Source="{Binding Path=(vcontrols:ImageButton.Image),
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Button}}}"
Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}"
Stretch="Fill"
RenderTransformOrigin="0.5, 0.5">
<Image.Resources>
<Storyboard x:Key="ShrinkStoryboard">
<DoubleAnimation Storyboard.TargetName="ImageScale"
Storyboard.TargetProperty="(ScaleTransform.ScaleX)"
To="0.8"
Duration="0:0:0.15"
AutoReverse="False"/>
<DoubleAnimation Storyboard.TargetName="ImageScale"
Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
To="0.8"
Duration="0:0:0.15"
AutoReverse="False"/>
</Storyboard>
<Storyboard x:Key="GrowStoryboard">
<DoubleAnimation Storyboard.TargetName="ImageScale"
Storyboard.TargetProperty="(ScaleTransform.ScaleX)"
To="1.0"
Duration="0:0:0.15"
AutoReverse="False"/>
<DoubleAnimation Storyboard.TargetName="ImageScale"
Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
To="1.0"
Duration="0:0:0.15"
AutoReverse="False"/>
</Storyboard>
</Image.Resources>
<Image.RenderTransform>
<ScaleTransform x:Name="ImageScale" ScaleX="1" ScaleY="1" CenterX="1" CenterY="1"/>
</Image.RenderTransform>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Pressed" Storyboard="{StaticResource ShrinkStoryboard}"/>
<VisualState x:Name="MouseOver" Storyboard="{StaticResource GrowStoryboard}"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Image>
</ControlTemplate>
<Style x:Key="ImageButtonStyle" TargetType="Button">
<Setter Property="Opacity" Value="0.5"/>
<Setter Property="Template" Value="{StaticResource ImageButtonTemplate}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
И, наконец, для того, чтобы использовать его у меня есть что-то вроде этого:
<Button Width="32"
Height="32"
Style="{StaticResource ImageButtonStyle}"
vcontrols:ImageButton.Image="/Images/someimage.png"/>
Когда я компилирую и выполняю приложение, все работает отлично. Кнопка получает изображение и использует анимации, определенные в стиле.
Во время разработки Visual Studio, похоже, не может визуализировать его, и редактор XAML показывает криволинейные линии под определением всей кнопки.
Информация об ошибке говорит:
префикс 'vcontrols' не связан с пространством имен.
Это ссылка на использование vcontrols в стиле. Если вы измените имя там, ошибка также изменится, , так что это не связано с именем, выбранным в Window/UserControl, который использует кнопку.
Что может быть причиной этого и есть способ исправить его, чтобы он работал и во время разработки?
Вы пытались добавить объявление пространства имен в корневой элемент документа XAML? Может быть, Visual Studio ищет только объявления? –
Попробуйте добавить биты сборки в объявлении пространства имен ... xmlns: vcontrols = "clr-namespace: Vialis.Led.LedControl5.Controls; assembly = ???" – MaLio
Привет, хорошо, что сборка такая же, как и приложение (сначала это была внешняя сборка, но я решил, что перемещение элементов управления в одну и ту же сборку может решить ее ... это не так. Явно добавление: сборка = Vialis.Led .LedControl5 'тоже не помогает, это только ухудшает ситуацию. – TimothyP