如何在listview中启用复制项目

时间:2014-10-09 09:41:13

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

我正在制作演示聊天应用程序,我想要的是允许用户选择listview datatemplate内的聊天消息。 有没有办法允许用户复制邮件?另外,我想在消息中显示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>

提前致谢。

3 个答案:

答案 0 :(得分:0)

设置文字:Clipboard.SetText(“foo-bar”)

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

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

答案 1 :(得分:0)

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

这个会有所帮助。

Tap button to copy text?

答案 2 :(得分:0)

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

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");

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

希望这有帮助。

[编辑]

要在邮件中添加网址作为可点击链接,只需在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对象中使用相应的属性。