【问题标题】:Different ListView item Launch Different Flyout不同的 ListView 项目启动不同的 Flyout
【发布时间】:2015-03-08 20:07:12
【问题描述】:

我正在寻找一种方法来根据变量 Type 上的值为不同的 ListViewItem 启动不同的 Flyout,但目前转换器无法正常工作。

假设我有 1 个转换器、2 个 Flayouts 和 1 个 DataTemplate。

<Page.Resources>
    <common:TypeToFlyoutTypeConverter x:Key="typeToFlyoutConverter"/>
    <Flyout x:Name="FlyoutTemplateConfirmed">
        <Grid >
            <TextBlock Text="Confirmed"/>
        </Grid>
    </Flyout>
    <Flyout x:Name="FlyoutTemplateRejected">
        <Grid >
            <TextBlock Text="Rejected"/>
        </Grid>
    </Flyout>
    <DataTemplate x:Key="ListViewItemTemplate">
        <Grid Tapped="Grid_Tapped" 
              FlyoutBase.AttachedFlyout="{Binding Type, Converter={StaticResource typeToFlyoutConverter}}">
        </Grid>
    </DataTemplate>
</Page.Resources>

当转换器:

public class TypeToFlyoutTypeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if ((value as String).Contains("TypeConfirmed"))
            return "StaticResource FlyoutTemplateConfirmed";
        else
            return "StaticResource FlyoutTemplateRejected";
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotSupportedException();
    }
}

还有 ListView:

<ListView
    SelectionMode="None" IsItemClickEnabled="True" IsSwipeEnabled="false"
    ItemTemplate="{StaticResource ListViewItemTemplate}"
    ItemsSource="{Binding}">
</ListView>

还有Grid_Tapped 事件处理程序:

private void Grid_Tapped(object sender, TappedRoutedEventArgs e)
{
    FrameworkElement element = sender as FrameworkElement;
    if (element != null)
    {
        FlyoutBase.ShowAttachedFlyout(sender as FrameworkElement);
    }
}

是否可以根据Type的值启动不同的Flyout?

谢谢!

【问题讨论】:

    标签: c# windows-runtime winrt-xaml flyout


    【解决方案1】:

    你可以使用基于类型的多态性来做到这一点

    public object ShowAttachedFlyout(FrameworkElement t)
    {
    
    }
    public object ShowAttachedFlyout( OtherspecificTYpe o)
    {
    
    }
    

    然后用动态调用它

    FlyoutBase.ShowAttachedFlyout((dynamic)sender);
    

    【讨论】:

    • 抱歉暂时搁置了。嗯...您能否提供一个示例代码来说明如何使用它作为示例?我已经尝试了您的示例,但还没有得到有效的结果:(
    【解决方案2】:

    在stackoverflow闲逛了几个小时后,我从here得到了一个很好的解决方法:

    我没有使用转换器,而是定义了要附加的浮出控件并以编程方式在Grid_Tapped 上显示它:

        private void Grid_Tapped(object sender, TappedRoutedEventArgs e)
        {
            string itemType = ((sender as Grid).DataContext as blabla).Type;
    
            if (itemType.Contains("blibli") && (sender as FrameworkElement) != null)            
                FlyoutBase.SetAttachedFlyout(sender as FrameworkElement, (Flyout)this.Resources["FlyoutTemplateConfirmed"]);
            else if ((sender as FrameworkElement) != null)            
                FlyoutBase.SetAttachedFlyout(sender as FrameworkElement, (Flyout)this.Resources["FlyoutTemplateRejected"]);
    
            FlyoutBase.ShowAttachedFlyout(sender as FrameworkElement);
        }
    

    【讨论】:

      猜你喜欢
      • 2011-12-26
      • 2021-04-02
      • 2013-04-23
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多