Ошибка конструктора WPF гласит, что «Не удалось создать экземпляр типа ...» для моего пользовательского элемента управления UserControl при применении StaticResource - PullRequest
2 голосов
/ 13 сентября 2010

У меня интересная проблема.Я создал WPF UserControl, который содержит кнопку с использованием шаблона:

<Button x:Name="btnStart" Template="{StaticResource RoundedGlassButton}" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="4" Height="32" Background="DarkGreen" Foreground="White" Width="72" Content="Start" />

Когда я помещаю UserControl в родительский элемент управления или форму, дизайнер выдает ошибку, "Не удалось создатьэкземпляр типа 'MyUserControl'. " Однако, хотя дизайнер не будет работать, приложение все равно будет компилироваться, и я получаю желаемые результаты во время выполнения.Я сузил проблему до шаблона, примененного к моей кнопке.Когда я удаляю шаблон, дизайнер работает:

<Button x:Name="btnStart" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="4" Height="32" Background="DarkGreen" Foreground="White" Width="72" Content="Start" />

Я использую этот конкретный шаблон повсеместно - так что я знаю, что он работает.Это даже работает на других UserControls.Я просто не могу понять, почему это не работает в этом конкретном UserControl.

У кого-нибудь есть идеи?Трудно создать пользовательский интерфейс, не видя результатов в визуальном конструкторе.

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

    <ControlTemplate x:Key="RoundedGlassButton" TargetType="{x:Type Button}">
    <ControlTemplate.Resources>
        <Storyboard x:Key="Timeline1">
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="glow" Storyboard.TargetProperty="(UIElement.Opacity)">
                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Key="Timeline2">
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="glow" Storyboard.TargetProperty="(UIElement.Opacity)">
                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </ControlTemplate.Resources>
    <Border BorderBrush="#FF888888" BorderThickness="1,1,1,1" CornerRadius="4">
        <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="#FF000000" BorderThickness="1,1,1,1" CornerRadius="4">                
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="0.507*"/>
                    <RowDefinition Height="0.493*"/>
                </Grid.RowDefinitions>
                <Border Opacity="0" BorderThickness="2" BorderBrush="White" HorizontalAlignment="Stretch" x:Name="glow" Width="Auto" Grid.RowSpan="2" CornerRadius="4">
                    <Border.BitmapEffect>
                        <BlurBitmapEffect Radius="2" />
                    </Border.BitmapEffect>                       
                </Border>
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Width="Auto" Grid.RowSpan="2" SnapsToDevicePixels="True" />
                <Border HorizontalAlignment="Stretch" Margin="0,0,0,0" x:Name="shine" Width="Auto" CornerRadius="4,4,8,8">
                    <Border.Background>
                        <LinearGradientBrush EndPoint="0.494,0.889" StartPoint="0.494,0.028">
                            <GradientStop Color="#AAFFFFFF" Offset="0"/>
                            <GradientStop Color="#33FFFFFF" Offset="1"/>
                        </LinearGradientBrush>
                    </Border.Background>
                </Border>
            </Grid>
        </Border>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="Opacity" TargetName="shine" Value="0.4"/>
            <Setter Property="Background" TargetName="border" Value="#CC000000"/>
            <Setter Property="Visibility" TargetName="glow" Value="Hidden"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard Storyboard="{StaticResource Timeline1}"/>
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard x:Name="Timeline2_BeginStoryboard" Storyboard="{StaticResource Timeline2}"/>
            </Trigger.ExitActions>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

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

Ответы [ 2 ]

2 голосов
/ 15 сентября 2010

Хорошо, я довольно смущен.Как оказалось, я забыл добавить ссылку на ресурс, содержащий шаблон, в верхней части моей разметки UserControl.Первые несколько строк разметки в моем файле UserControl должны были выглядеть примерно так:

    <UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/MyTemplates/MyTemplate.xaml" />
        </ResourceDictionary.MergedDictionaries>...

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

0 голосов
/ 13 сентября 2010

Есть ли другие вложенные исключения?

Я видел это, когда что-то (например, конвертер внутри шаблона) вызывало какое-то другое исключение или полагалось на Application.Current для чего-то.(app.current - VS или Blend во время разработки, ваше приложение во время выполнения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...