Silverlight ChangePropertyAction on Button не работает - PullRequest
2 голосов
/ 12 марта 2012

«Из коробки», если вы включите Blend, поместите кнопку в сетку и установите для нее пару ChangeProeprtyActions ... произойдет сбой с сообщением об ошибке.

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
x:Class="SL4_Button_States.MainPage"
Width="640" Height="480">

<Grid x:Name="LayoutRoot" Background="White">
    <Button x:Name="button" Content="Button" Height="39" Margin="68,42,299,0" VerticalAlignment="Top">
        <i:Interaction.Triggers>
            <i:EventTrigger>
                <ei:ChangePropertyAction PropertyName="Content" Value="Button is now loaded!" TargetObject="{Binding ElementName=button}"/>
            </i:EventTrigger>
            <i:EventTrigger EventName="Click">
                <ei:ChangePropertyAction PropertyName="Content" Value="temporary"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
</Grid>

Сообщение об ошибке таково:

    Webpage error details

Message: Unhandled Error in Silverlight Application The type 'Object' was not found. [Line: 2 Position: 10]   at MS.Internal.XcpImports.CreateFromXaml(String xamlString, Boolean createNamescope, Boolean requireDefaultNamespace, Boolean allowEventHandlers, Boolean expandTemplatesDuringParse)
   at MS.Internal.XcpImports.CreateFromXaml(String xamlString, Boolean createNamescope, Boolean requireDefaultNamespace, Boolean allowEventHandlers)
   at Microsoft.Expression.Interactivity.TypeConverterHelper.ExtendedStringConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
   at Microsoft.Expression.Interactivity.Core.ChangePropertyAction.Invoke(Object parameter)
   at System.Windows.Interactivity.TriggerBase.InvokeActions(Object parameter)
   at System.Windows.Interactivity.EventTriggerBase.OnEvent(EventArgs eventArgs)
   at System.Windows.Interactivity.EventTriggerBase.OnEventImpl(Object sender, EventArgs eventArgs)
   at MS.Internal.CoreInvokeHandler.InvokeEventHandler(UInt32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName, UInt32 flags)
Line: 1
Char: 1
Code: 0
URI: http://localhost:62193/Silverlight.js

Если вы добавите действие ChangePropertyAction в TextBlock ... работает нормально:

<TextBlock Height="20" Margin="207,132,138,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseLeftButtonDown">
                <ei:ChangePropertyAction PropertyName="Text" Value="Mouse Left BUtton Down"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBlock>

Если у вас есть идея, почему это происходит, пожалуйста, просветите меня ... если есть другой / лучший способ сделать это, кроме штатов, пожалуйста, дайте мне знать.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 15 августа 2012

Как изменить содержимое кнопки с помощью ChangePropertyAction в Blend?

Все последующие шаги выполняются в Express Blend 4.

  1. Добавить кнопку в ArtBoard. Перетащите «ChangePropertyAction» из Активов в кнопка.
  2. На панели «Данные» создайте новый источник данных ContentControl (нажмите «Создать источник данных объекта», выполните поиск «ContentControl» и нажмите «ОК». Источник данных будет назван ContentControlDataSource).
  3. В Object и Timeline, сфокусируйте действие ChangePropertyAction кнопки. В Property-> Common Properties-> PropertyName выберите «Content» и создайте привязку данных к ContentControlDataSource со значением. (при установке значения содержимого щелкните маленький прямоугольник в конце значения. Выберите «Привязка данных ...», в диалоговом окне «Создать привязку данных» выберите ContentControlDataSource в поле данных)
  4. На панели «Объекты и временная шкала» отмените фокусировку, а затем снова сфокусируйте действие «Изменить свойства» кнопки. В Property-> Common Properties-> Value вы можете увидеть желтый прямоугольник вокруг текста, например «(ContentControl) New». Нажмите на маленький желтый прямоугольник в конце и выберите «Сброс». После исчезновения желтого прямоугольника нажмите кнопку «Создать» после свойства «Значение». Когда появится диалоговое окно «Выбор объекта», найдите «TextBlock» и добавьте его. Затем установите текст TextBlock, как вы хотите. Постройте и протестируйте его сейчас. Нажмите кнопку, и вы увидите, что текст изменен на тот, который вы установили.

XAML выглядит так:

    <Button Content="Button" HorizontalAlignment="Left" Margin="125,51,0,0" VerticalAlignment="Top" Width="75">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <ei:ChangePropertyAction PropertyName="Content">
                    <ei:ChangePropertyAction.Value>
                        <TextBlock Text="HelloText"/>
                    </ei:ChangePropertyAction.Value>
                </ei:ChangePropertyAction>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
3 голосов
/ 13 марта 2012

Сбой, потому что свойство Content для Button - это не просто строка, а объект.Хотя Blend позволит вам установить его, я не уверен, что это возможно.Чтобы изменить текстовое содержимое кнопки, вам нужно сделать что-то вроде этого:

<Button x:Name="button" HorizontalAlignment="Left" Height="23" Margin="154,98,0,0" VerticalAlignment="Top" Width="113">
    <Button.Content>
        <TextBlock x:Name="btnText" Text="Orginal"  />
    </Button.Content>
    <i:Interaction.Triggers>
    <i:EventTrigger>
      <ei:ChangePropertyAction PropertyName="Text" Value="Loaded" TargetName="btnText"/>
    </i:EventTrigger>
    <i:EventTrigger EventName="Click">
        <ei:ChangePropertyAction PropertyName="Text" Value="Clicked" TargetName="btnText"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

0 голосов
/ 13 марта 2012

Button x: Name = "button" Content = "Button" Высота = "39" Margin = "68,42,299,0" Click = "button_Click" MouseRightButtonDown = "button_MouseRightButtonDown" VerticalAlignment = "Top"

    private void button_MouseRightButtonDown(object sender, MouseButtonEventArgs e)

    {
        ((Button)sender).Content = "Right Click";
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        ((Button)sender).Content = "Button Click";
    }
...