В экземпляре объекта не задана ссылка на объект - PullRequest
0 голосов
/ 10 августа 2011

Я пытаюсь сделать пользовательский элемент управления кнопкой изображения.Но когда я устанавливаю изображение в окне Initialize, тогда выбрасываю это исключение.Вот мой код

Экзамен.

<UserControl.Resources>
    <Style x:Key="ImageButton" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <StackPanel>
                        <Image x:Name="ButtonImage" Stretch="None"/>
                        <ContentPresenter Margin="0,8,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </StackPanel>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsFocused" Value="True"/>
                        <Trigger Property="IsDefaulted" Value="True"/>
                        <Trigger Property="IsMouseOver" Value="True"/>
                        <Trigger Property="IsPressed" Value="True"/>
                        <Trigger Property="IsEnabled" Value="False"/>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<Button x:Name="ProcestaImageButton" Content="TextBlock" Style="{DynamicResource ImageButton}"/>

Код C #.

    public ImageSource ButtonImage
    {
        get { return ((this.ProcestaImageButton.Template).FindName("ButtonImage", this.ProcestaImageButton) as Image).Source; }
        set { ((this.ProcestaImageButton.Template).FindName("ButtonImage", this.ProcestaImageButton) as Image).Source = value; }
    }

Пожалуйста, скажите мне, где я неправ. Пожалуйста, предоставьте мне пример.Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Для начала я бы расширил это свойство - каждое утверждение довольно сложно в данный момент. Вот расширенная версия:

public ImageSource ButtonImage
{
    get
    { 
        var template = ProcestaImageButton.Template
                                .FindName("ButtonImage", ProcestaImageButton);

        var image = template as Image;
        return image.Source;
    }
    set
    {
        var template = ProcestaImageButton.Template
                                .FindName("ButtonImage", ProcestaImageButton);
        var image = template as Image;
        image.Source = value;
    }
}

Тогда я, вероятно, извлеку общий код в свойство помощника:

private Image ProcestaImageButtonImage
{
    get
    {
        var template = ProcestaImageButton.Template
                                FindName("ButtonImage", ProcestaImageButton);

        return template as Image;
    }
}

public ImageSource ButtonImage
{
    get { return ProcestaImageButtonImage.Source; }
    set { ProcestaImageButtonImage.Source = value; }
}

Далее я бы сменил as на актерский состав:

private Image ProcestaImageButtonImage
{
    get
    {
        var template = ProcestaImageButton.Template
                                .FindName("ButtonImage", ProcestaImageButton);

        return (Image) template;
    }
}

public ImageSource ButtonImage
{
    get { return ProcestaImageButtonImage.Source; }
    set { ProcestaImageButtonImage.Source = value; }
}

На данный момент у вас может все еще есть NullReferenceException или у вас может есть InvalidCastException - и вдруг у вас появляется гораздо больше информации о том, что не так.

Актерский состав здесь лучше, поскольку вы всегда ожидаете, что FindName вернет Image, не так ли? Если условие сбоя при преобразовании типа является ошибочным, следует использовать только приведение типа as, если допустимо выражение , а не целевого типа, и вы собираетесь обработать его. этот случай отдельно.

0 голосов
/ 10 августа 2011

Простое предположение, но входит ли изображение, которое вы добавляете в свою кнопку, в ваш проект (в visual studio)? И если да, установлено ли для его свойства "build action" значение "resource"?

...