【问题标题】:Windows Phone 8.1 ListView element execute code after bindWindows Phone 8.1 ListView 元素在绑定后执行代码
【发布时间】:2016-05-11 12:37:30
【问题描述】:

我在绑定到集合的 XAML 接口中定义了一个 ListView。

列表视图的 DataTemplate 具有 WebView。我需要这个 WebView 来调整它的内容,这意味着在 ListView 被绑定,元素被创建,并且这些元素被绑定之后,我需要在每个 WebView 上执行一段代码。

我已经完成了绑定 WebView 的工作,并且我有代码可以调整 WebView 的大小。我只需要知道如何执行它;放在哪里;如何获取 WebView 以及何时尝试获取它们。

编辑:

这是我的列表视图。

        <ListView Opacity="{Binding IsRefreshing, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BooleanToGhost}}" Grid.Row="0" Name="listView" ItemsSource="{Binding Messages}"  IsItemClickEnabled="False" SelectionMode="Single">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="8">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <Rectangle Grid.ColumnSpan="2" Grid.RowSpan="2" Fill="White" RadiusX="12" RadiusY="12" />
                        <TextBlock Foreground="#FFAAAAAA" Grid.Row="0" Grid.Column="0" Margin="8" Text="You" HorizontalAlignment="Left" FontSize="11" Visibility="{Binding IsFromStaff, Mode=OneTime,Converter={StaticResource BooleanToInvisibility}}" />
                        <TextBlock Foreground="#FFAAAAAA" Grid.Row="0" Grid.Column="0" Margin="8" Text="Staff" HorizontalAlignment="Left" FontSize="11" Visibility="{Binding IsFromStaff, Mode=OneTime,Converter={StaticResource BooleanToVisibility}}" />
                        <TextBlock Foreground="#FFAAAAAA" Grid.Row="0" Grid.Column="1" Margin="8" Text="{Binding Timestamp, Mode=OneTime}" HorizontalAlignment="Right" FontSize="11" />
                        <WebView local:MyProperties.HtmlString="{Binding Body}" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="8" ScrollViewer.VerticalScrollBarVisibility="Disabled" />
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
            <interactivity:Interaction.Behaviors>
                <core:EventTriggerBehavior EventName="SelectionChanged">
                    <core:InvokeCommandAction Command="{Binding ShowCaseCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=listView, Path=SelectedItem}" />
                </core:EventTriggerBehavior>
            </interactivity:Interaction.Behaviors>
        </ListView>

【问题讨论】:

  • 你能添加一些代码片段
  • 当然。我添加了列表视图的代码。有一个 DataTemplate,它有一个 WebView 作为孩子。我想执行在每个 WebView 出现后对其进行操作的代码。我不能扩展 WebView 因为它是一个密封的类。没有其他相关代码可显示。我需要知道如何添加相关代码。

标签: c# windows xaml listview webview


【解决方案1】:

解决方案是一种叫做“行为”的东西。

我们在代码 sn-p 中看到 DataTemplate 包含一个 WebView,这是我想要影响的项目。所以我在 WebView 中添加了一个Behavior,这是一个带代码的类。这个类看起来像这样:

public class WebViewSizeBehavior : DependencyObject, IBehavior
{
    public DependencyObject AssociatedObject { get; private set; }

    public void Attach(DependencyObject associatedObject)
    {
        var control = associatedObject as WebView;
        if (control == null)
            throw new ArgumentException(
                "WebViewSizeBehavior can be attached only to WebView.");
        AssociatedObject = associatedObject;
        control.LoadCompleted += Control_LoadCompleted;
    }

    private void Control_LoadCompleted(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e)
    {
        var control = (WebView) AssociatedObject;

        var resizeTask = control.ResizeToContent();
    }

    public void Detach()
    {
        var control = (WebView) AssociatedObject;
        control.LoadCompleted -= Control_LoadCompleted;
        AssociatedObject = null;
    }
}

我的命名空间和 XAML 已被装配,因此此类只能通过 local 命名空间访问。如何做到这一点超出了这个答案的范围。因此,鉴于此,我可以像这样修改 XAML:

<ListView.ItemTemplate>
    <DataTemplate>
        …
        <WebView …>
            <interactivity:Interaction.Behaviors>
                <local:WebViewSizeBehavior />
            </interactivity:Interaction.Behaviors>
        </WebView>
    </DataTemplate>
</ListView.ItemTemplate>

我遗漏了超出此线程范围的内容。有关将 WebView 适配到其内容以及命名空间和 XML 命名空间的信息,请在别处找到。

【讨论】:

    猜你喜欢
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2015-08-25
    相关资源
    最近更新 更多