【问题标题】:Silverlight ChangePropertyAction on Button control not working按钮控件上的 Silverlight ChangePropertyAction 不起作用
【发布时间】:2012-03-12 00:20:41
【问题描述】:

开箱即用,如果您启动 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

如果您在 TextBlock 上添加 ChangePropertyAction ... 工作正常:

<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>

如果您知道为什么会发生这种情况,请赐教……如果有其他/更好的方法可以做到这一点,请告诉我。

谢谢。

【问题讨论】:

    标签: silverlight silverlight-4.0 expression-blend silverlight-5.0


    【解决方案1】:

    它失败了,因为 Button 上的 Content 属性不仅仅是一个字符串,而是一个对象。尽管 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>
    

    【讨论】:

    • 谢谢科比!我暗示了很多事情......这就是为什么我期待它知道,如何处理它,在它让我选择它的情况下...... :)
    【解决方案2】:

    如何在 Blend 中通过 ChangePropertyAction 改变 Button 的内容?

    以下所有步骤都在 Express Blend 4 中。

    1. 在画板中添加一个按钮。将“ChangePropertyAction”从 Assets 拖到 按钮。
    2. 在“数据”面板中,新建一个 ContentControl 数据源(点击“创建对象数据源”,搜索“ContentControl”并单击“确定”。数据源将命名为 ContentControlDataSource)。
    3. 在对象和时间轴中,聚焦按钮的 ChangePropertyAction。在 Property->Common Properties->PropertyName 中,选择“Content”,然后创建一个到 ContentControlDataSource 的数据绑定,并带有 Value。 (在设置Content的Value时,点击value末尾的小矩形。选择“Data Binding...”,在“Create Data Binding”对话框中,在Data Field中选择ContentControlDataSource)
    4. 在“对象和时间轴”面板中,取消焦点然后再次聚焦按钮的 ChangePropertyAction。在 Property->Common Properties->Value 中,您可以看到文本周围有一个黄色矩形,如“(ContentControl) New”。单击末尾的黄色小矩形,然后选择“重置”。黄色矩形消失后,单击 Value 属性后的 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】:

      Button x:Name="button" Content="Button" Height="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";
          }
      

      【讨论】:

      • 感谢您的帖子 mani,但我很感兴趣如何从 xaml 角度实现这一目标。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多