Почему доступ к моему Storyboard x: Name работает в Silverlight, но не в WPF? - PullRequest
6 голосов
/ 25 марта 2009

Следующий код WPF получает ошибку: Имя 'zipButtonOut' не существует в текущем контексте.

Однако идентичный код работает в Silverlight, как я продемонстрирую здесь: http://tanguay.info/web/index.php?pg=codeExamples&id=65

Что мне нужно сделать с кодом WPF, чтобы получить доступ к раскадровке в Window.Resources? Я тоже пробовал это в пользовательском элементе управления WPF, но получил ту же ошибку.

XAML:

<Window x:Class="TestDataGrid566.Test1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test1" Height="300" Width="300">
    <Window.Resources>
        <Storyboard x:Name="zipButtonOut" x:Key="zipButtonOut">
            <DoubleAnimation Storyboard.TargetName="buttonContinue"
Storyboard.TargetProperty="Width"
From="0" To="300" Duration="0:0:.2"></DoubleAnimation>
            <DoubleAnimation Storyboard.TargetName="buttonContinue"
Storyboard.TargetProperty="Height"
From="2" To="50" Duration="0:0:.4"></DoubleAnimation>
        </Storyboard>
    </Window.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel HorizontalAlignment="Center" Margin="20">
            <Button x:Name="buttonBegin" Content="Click here to begin" Background="Green" Click="buttonBegin_Click"/>
            <Button x:Name="buttonContinue" Margin="0 70 0 0" Width="160" Height="2" FontSize="18" Background="Yellow"
Content="Click here to continue" Visibility="Collapsed"></Button>
        </StackPanel>
    </Grid>
</Window>

код-за:

using System.Windows;

namespace TestDataGrid566
{
    public partial class Test1 : Window
    {
        public Test1()
        {
            InitializeComponent();
        }

        private void buttonBegin_Click(object sender, RoutedEventArgs e)
        {
            buttonBegin.Visibility = Visibility.Collapsed;
            buttonContinue.Visibility = Visibility.Visible;
            //zipButtonOut.Begin(); //GETS ERROR: The name 'zipButtonOut' does not exist in the current context.
        }
    }
}

Ответы [ 2 ]

12 голосов
/ 25 марта 2009

Я не знаю, почему это работает в Silverlight, но в элементах управления WPF, которые вы добавляете в коллекцию ресурсов, они недоступны по их x: Name в коде позади. Они доступны через коллекцию Resources по их x: Key, так что вы можете удалить атрибут x: Name и добавить следующую строку кода непосредственно перед строкой в ​​вашем коде, которая закомментирована, и она будет работать (раскомментировать Конечно, эта строка):

Storyboard zipButtonOut = (Storyboard)Resources["zipButtonOut"];

Обратите внимание, что для этого требуется следующий оператор использования:

using System.Windows.Media.Animation;
0 голосов
/ 19 июля 2009

Похоже, что инструменты VS Silverlight генерируют аксессор zipButtonOut для ресурсов x: Name. В будущем просто взгляните на сгенерированный файл (вероятно, «test1.g.cs») в папке obj, чтобы увидеть, какой код генерируется для x: Names.

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