【问题标题】:How to enable copying item inside listview如何在列表视图中启用复制项目
【发布时间】:2014-10-09 09:41:13
【问题描述】:

我正在制作演示聊天应用程序,我想要的是允许用户选择列表视图数据模板中的聊天消息。 有没有办法允许用户复制消息?我还想将消息中的 url 显示为可点击的超链接。

 <DataTemplate x:Key="ChatTemplate">
    <Grid HorizontalAlignment="Stretch">
       <Grid  HorizontalAlignment="Right"  >
          <Border BorderBrush="Orange" BorderThickness="1"  CornerRadius="10" HorizontalAlignment="Left" Height="auto"  VerticalAlignment="Top">

        <Grid VerticalAlignment="Stretch">

            <TextBox Grid.Row="1" Margin="5"  MinHeight="30" IsReadOnly="True" Text="{Binding message}" TextWrapping="Wrap"  Foreground="Black" FontSize="14"  />
                    </Grid>
                </Border>
            </Grid>
        </Grid>
</DataTemplate>

<ListView
 x:Name="chatListView"
 AutomationProperties.AutomationId="chatListView"
 AutomationProperties.Name="Items"
 Grid.Row="2"
 Margin="120,0,0,0"
 IsItemClickEnabled="False" 
 ItemTemplate="{StaticResource ChatTemplate}"
 SelectionMode="None"
 IsSwipeEnabled="True">
 </ListView>

提前致谢。

【问题讨论】:

    标签: xaml windows-8 windows-store-apps windows-8.1


    【解决方案1】:

    设置文本:Clipboard.SetText("foo-bar")

    检查剪贴板是否包含文本:Clipboard.ContainsText("foo-bar")

    没有方法获取文本 Clipboard.GetText() 导致安全异常

    【讨论】:

    • 我想要的是我已经用以前的聊天填充了列表视图,现在如果用户想要复制任何聊天,他/她应该能够做到这一点。默认情况下,列表视图不允许选择数据模板内的文本框中的聊天
    • 使用列表框的点击事件,而不是使用 clipboard.settext("listboxm selected item value etc") @zee 它会复制你想要的任何内容
    • 谢谢,我会试试的。此外,我想让用户灵活地选择,就像我们通常在文字处理中所做的那样,而不是复制所有内容。
    【解决方案2】:

    您是否尝试使用 Windows Phone Clipboard.复制所选文本?

    这个会很有帮助。

    Tap button to copy text?

    【讨论】:

    • 感谢您的回复,但我正在使用 Windows8.1 应用程序,因此您的链接没有用。
    【解决方案3】:

    如果我理解正确,我会复制/引用选定的绑定对象并将其存储在其他地方。消息的文本将是对象的属性,因此也可以转移到其他地方或稍后由剪贴板复制。因此,例如,您可能已经在做类似的事情了:

    public class Message
    {
        public string strMessageUuid { get; set; }
        public string strUserUuid { get; set; }
        public string strMessageSender { get; set; }
        public string strMessageText { get; set; }
        public bool booMessageSaved  { get; set; }
    }
    

    然后将您的消息列表绑定到您的 ListBox:

    ObservableCollection<Message> obsMessages = new ObservableCollection<Message>();
    lstChatMessages.ItemsSource = obsMessages;
    

    因此,当用户点击 ListItem 时,您可以获得相关对象:

    private void lstChatMessages_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.AddedItems.Count > 0 && lstChatMessages.SelectedItem != null)
        {
            Message objMessage = (Message)e.AddedItems[0];
            //Now you can do what you want with the message, eg
            MessageBox.Show(objMessage.strMessageText);
        }
    }
    

    因此,您可以将所选消息存储在已保存消息的新列表中,例如

    List<Message> lstUserSavedMessages = new List<Message>();
    lstUserSavedMessages.Add(objMessage);
    

    然后将列表存储在某处。或者你可以只获取你想要的属性并存储它,或者只是存储消息 uuid 并从主列表中检索相关消息,或者添加一个已保存/收藏的属性,然后对其进行过滤,例如

    var savedmessages = obsMessages.Where(a => a.booMessageSaved == "true" && a.strUserUuid == "exampleuseridvalue");
    

    您可以在其他地方向用户显示已保存的聊天记录,并让他们在需要时复制到剪贴板等,或者具有可以为他们发送消息正文的电子邮件功能等。

    希望这会有所帮助。

    [编辑]

    要将 url 添加为消息中的可点击链接,只需将 XAML 中的超链接按钮添加到 ListBox 的数据模板,例如:

    <ListBox Name="lstChatMessages" Height="550" Margin="0,0,0,0">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <!-- Your other layout items here -->
                            <HyperlinkButton NavigateUri="{Binding urlMessageUrl}" TargetName="_blank" Content="{Binding strContent}"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
    </ListBox>
    

    显然,您需要 Message 对象中的相应属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多