【UWP通用应用开发】集成搜索、粘贴板以及设置共享源和共享目标

简介:

在应用中集成搜索

上一节是关于如何添加应用设置和帮助,这一篇讲的是和设置类似的搜索。

So…… Let’s do it !

先从简单的页面布局开始,想想我们需要什么,一个带搜索事件的Button,还需要一些TextBlock来提示用户,核心部分自然是一个GridView咯。

<Grid Background="Wheat">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>

        <StackPanel Grid.Row="0" Orientation="Vertical">
            <Button Grid.Row="0" Name="btnSearch" VerticalAlignment="Center" HorizontalAlignment="Left" 
                Content="搜索" FontFamily="华文行楷" Click="btnSearch_Click" Margin="12" FontSize="34" Foreground="Red"/>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="搜索关键词" Foreground="Green" FontSize="28" Margin="12"/>
                <TextBlock FontSize="28" Foreground="Green" Name="tBlockKeyword" Margin="12"/>
            </StackPanel>                   
        </StackPanel>

        <GridView Grid.Row="1" Margin="12" x:Name="gridView">
            <GridView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapGrid Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </GridView.ItemsPanel>
            <GridView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}" FontSize="24" Foreground="Pink" FontFamily="楷体"/>
                </DataTemplate>
            </GridView.ItemTemplate>
        </GridView>
    </Grid>

既然界面完成了,就该去后台捣鼓咯。搜索的核心在于SearchPane,所以先来实例化它。为了简化,我们就将待搜索的内容设置为一串字符串数组好了,当然了,初始化数组的方式大家随意就好了。

SearchPane searchPane = null;
string[] exampleStr = new string[100];

public  void InitExampleStr()
{
     Random ran = new Random();
     int exNumber;
     for(int i=0;i<100;i++)
     {
          exNumber = ran.Next(1000, 9999);
          exampleStr[i] = exNumber.ToString();                             
      }                                                                                     
}

当用户在搜索框中输入的内容发生了更改时就会触发searchPane_QueryChange事件。

当用户在完成输入后按下Enter键或者点击旁边的搜索确认按钮后就会触发searchPane_QuerySubmitted事件。

        void searchPane_QueryChanged(SearchPane sender, SearchPaneQueryChangedEventArgs args)
        {                                     
            this.tBlockKeyword.Text = args.QueryText;
        }

        void searchPane_QuerySubmitted(SearchPane sender, SearchPaneQuerySubmittedEventArgs args)
        {       
            string key = args.QueryText;
            var result = exampleStr.Where(s => s.Contains(key)).ToArray();             
            this.gridView.ItemsSource = result;
        }

然后我们还需要这两个事件在OnNavigatedTo中绑定以及在OnNavigatedFrom中解绑。

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.searchPane.QuerySubmitted += searchPane_QuerySubmitted;
            this.searchPane.QueryChanged += searchPane_QueryChanged;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            this.searchPane.QuerySubmitted -= searchPane_QuerySubmitted;
            this.searchPane.QueryChanged -= searchPane_QueryChanged;
        }

然后我们需要点击Button控件来调出系统的搜索框,一行代码就足以搞定了。如果不想点击按钮也是可以得哦,可以让用户直接在键盘输入而调出搜索框呢。

        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            this.searchPane.Show();
        }
 this.searchPane.ShowOnKeyboardInput = true;

最后别忘了将他们都放到MainPage()中哦,

        public MainPage()
        {
            this.InitializeComponent();
            searchPane = SearchPane.GetForCurrentView();
            InitExampleStr();              
            this.searchPane.PlaceholderText = "请输入关键字";           
            this.searchPane.ShowOnKeyboardInput = true;
        }

所以说,总的代码是这样的。

        SearchPane searchPane = null;
        string[] exampleStr = new string[100];

        public MainPage()
        {
            this.InitializeComponent();
            searchPane = SearchPane.GetForCurrentView();
            InitExampleStr();              
            this.searchPane.PlaceholderText = "请输入关键字";           
            this.searchPane.ShowOnKeyboardInput = true;
        }

        public  void InitExampleStr()
        {
            Random ran = new Random();
            int exNumber;
            for(int i=0;i<100;i++)
            {
                exNumber = ran.Next(1000, 9999);
                exampleStr[i] = exNumber.ToString();                             
            }                                                                                     
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.searchPane.QuerySubmitted += searchPane_QuerySubmitted;
            this.searchPane.QueryChanged += searchPane_QueryChanged;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            this.searchPane.QuerySubmitted -= searchPane_QuerySubmitted;
            this.searchPane.QueryChanged -= searchPane_QueryChanged;
        }

        void searchPane_QueryChanged(SearchPane sender, SearchPaneQueryChangedEventArgs args)
        {                                     
            this.tBlockKeyword.Text = args.QueryText;
        }

        void searchPane_QuerySubmitted(SearchPane sender, SearchPaneQuerySubmittedEventArgs args)
        {       
            string key = args.QueryText;
            var result = exampleStr.Where(s => s.Contains(key)).ToArray();             
            this.gridView.ItemsSource = result;
        }

        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            this.searchPane.Show();
        }
    }

在清单文件中声明你需要使用“Search”功能后就可以开始调试咯。

这里写图片描述

这里写图片描述

大家肯定都用的音乐播放器肯定都会在搜索框下面给出一些建议吧,或者大家常用的地图等App。

那么我们就对前面的代码进行更新就好啦。

下面这段代码呢,就是根据用户的输入来显示建议列表的方法咯。

        void searchPane_SuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs args)
        {

            var deferralSeg= args.Request.GetDeferral();

            var q = from i in exampleStr
                    where i.Contains(args.QueryText)
                    select i;
            var res = q.Take(suggestionLen).ToArray();

            foreach (var item in res)
            {
                args.Request.SearchSuggestionCollection.AppendQuerySuggestion(item);
            }

            deferralSeg.Complete();
        }       

这篇博客,使用大量LINQ技术,如果不太懂的话可以看看这里。
【LINQ技术】扩展特性和LINQ操作符http://blog.csdn.net/nomasp/article/details/45461517

使用搜索建议的最大好处在于我们可以选择并非自己输入的内容,这个功能就由下面这段代码提供动力支持。

        void searchPane_ResultSuggestionChosen(SearchPane sender, SearchPaneResultSuggestionChosenEventArgs args)
        {                      
            sender.TrySetQueryText(args.Tag);

            var q = from t in exampleStr
                    where t.Contains(args.Tag)
                    select t;
            this.gridView.ItemsSource = q.ToArray();
        }

我们还可以对前面的searchPane_QuerySubmitted函数做如下修改。

        void searchPane_QuerySubmitted(SearchPane sender, SearchPaneQuerySubmittedEventArgs args)
        {
            //var q = from extStr in exampleStr
            //        where extStr.Contains(args.QueryText)
            //        select extStr;
            //this.gridView.ItemsSource = q.ToArray();

            string key = args.QueryText;
            var result = exampleStr.Where(s => s.Contains(key)).ToArray();
            this.gridView.ItemsSource = result;
        }

最后还需要将他们添加到OnNavigatedTo和OnNavigatedFrom方法中。

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.searchPane.QuerySubmitted += searchPane_QuerySubmitted;
            this.searchPane.QueryChanged += searchPane_QueryChanged;
            this.searchPane.SuggestionsRequested += searchPane_SuggestionsRequested;
            this.searchPane.ResultSuggestionChosen += searchPane_ResultSuggestionChosen;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            this.searchPane.QuerySubmitted -= searchPane_QuerySubmitted;
            this.searchPane.QueryChanged -= searchPane_QueryChanged;
            this.searchPane.SuggestionsRequested -= searchPane_SuggestionsRequested;
            this.searchPane.ResultSuggestionChosen -= searchPane_ResultSuggestionChosen;
        }

然后调试就会是这个效果咯。

这里写图片描述

使用粘贴板

记得智能手机刚出来那会比较火的一个概念“能够复制粘贴的手机就是智能手机”。现在看来,这不过是个老掉牙的功能了,但实际用处却是非常强大的,那么现在我们就来试试怎么做到这个功能。

粘贴板的英文名叫做Clipboard,这也是它的类名了。

新建工程这种就不说了,在XAML中代码如下:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Grid Margin="12" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="500">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

            <Button Grid.Row="0" Name="btnClip" Margin="0,3,0,16" Content="粘贴" FontSize="32" Click="btnClip_Click"  IsEnabled="False"/>

            <ScrollViewer Name="scrollView"  Grid.Row="1" Visibility="Collapsed">
                <TextBlock Margin="12" Name="tBlockClipboard" FontSize="35" Foreground="Gainsboro" TextWrapping="Wrap" />
            </ScrollViewer>
        </Grid>
    </Grid>

在后台代码中写上这么一个方法:

        void Clipboard_ContentChanged(object sender, object e)
        {
            DataPackageView pv = Clipboard.GetContent();

            if (pv.Contains(StandardDataFormats.Text))
            {
                btnClip.IsEnabled = true;
            }               
        }

StandardDataFormats是标准数据格式,这里判断它是否是Text,如果是的话则让前面的Button按钮可用(之前设为不可用,以灰色显示)。

标准数据格式有Bitmap,HTML,RTF,StorageItems,Text,Uri等。

然后在按钮的Click事件中写如下代码:

        private async void btnClip_Click(object sender, RoutedEventArgs e)
        {            
                var txt = await Clipboard.GetContent().GetTextAsync();
                tBlockClipboard.Text = txt;           
        }

这里我们使用了Clipboard类的GetContent()方法,用于在剪切板中取出DataPackageView对象数据;类似的还有SetContent(),用于把数据存入剪切板中。还有Clear事件来清空剪切板,Flush事件把数据从源写入到剪切板,并且在应用程序退出后依然保留在剪切板中。还有ContentChanged事件在剪切板中存储的数据内容发生变化时自动激活以达到监听剪切板内容变化的效果。

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            Clipboard.ContentChanged += Clipboard_ContentChanged;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            Clipboard.ContentChanged -= Clipboard_ContentChanged;
        }

        void Clipboard_ContentChanged(object sender, object e)
        {
            DataPackageView pv = Clipboard.GetContent();

            if (pv.Contains(StandardDataFormats.Text)||pv.Contains(StandardDataFormats.Bitmap))
            {
                btnClip.IsEnabled = true;
            }               
        }

大家可以试试,已经完成了,但我们可以做的更多,不是吗?
完整的代码如下:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Grid Margin="12" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="500">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

            <Button Grid.Row="0" Name="btnClip" Margin="0,3,0,16" Content="粘贴" FontSize="32" Click="btnClip_Click"  IsEnabled="False"/>

            <ScrollViewer Name="scrollView"  Grid.Row="1" Visibility="Collapsed">
                <TextBlock Margin="12" Name="tBlockClipboard" FontSize="35" Foreground="Gainsboro" TextWrapping="Wrap" />
            </ScrollViewer>

            <Image x:Name="imgClicpboard" Grid.Row="1" Margin="5" Stretch="Uniform" Visibility="Collapsed"/>
        </Grid>
    </Grid>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            Clipboard.ContentChanged += Clipboard_ContentChanged;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            Clipboard.ContentChanged -= Clipboard_ContentChanged;
        }

        void Clipboard_ContentChanged(object sender, object e)
        {
            DataPackageView pv = Clipboard.GetContent();

            if (pv.Contains(StandardDataFormats.Text)||pv.Contains(StandardDataFormats.Bitmap))
            {
                btnClip.IsEnabled = true;
            }               
        }             

        private async void btnClip_Click(object sender, RoutedEventArgs e)
        {
            scrollView.Visibility = Visibility.Collapsed;
            imgClicpboard.Visibility = Visibility.Collapsed;
            tBlockClipboard.Text = " ";
            imgClicpboard.Source = null;

            DataPackageView pv = Clipboard.GetContent();

            if (pv.Contains(StandardDataFormats.Text))
            {
                scrollView.Visibility = Visibility;
                var txt = await Clipboard.GetContent().GetTextAsync();
                tBlockClipboard.Text = txt;
            }
            else if(pv.Contains(StandardDataFormats.Bitmap))
            {
                imgClicpboard.Visibility = Visibility;
                var bmp = await Clipboard.GetContent().GetBitmapAsync();
                Windows.UI.Xaml.Media.Imaging.BitmapImage bitMap = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
                bitMap.SetSource(await bmp.OpenReadAsync());


                this.imgClicpboard.Source = bitMap;
            }
        }
    }

现在它还可以复制图片了哦~

这里写图片描述

设置共享(共享源和共享目标)

上一节简单介绍了通过粘贴板来共享数据,这一节将会添加更为强大的功能哦。

以下就是大概的样式了,随便看看就好了,这都不是重点。

     <Grid Background="AliceBlue">
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition />
                <RowDefinition Height="auto"/>
            </Grid.RowDefinitions>

            <TextBlock Grid.Row="0" FontSize="25"  Foreground="Red" Text="共享源示例"  Margin="12"/>

            <ScrollViewer Grid.Row="1" Margin="14" VerticalScrollMode="Auto" HorizontalScrollMode="Disabled">
                <StackPanel>
                    <StackPanel Orientation="Horizontal">     
                        <RadioButton x:Name="radioBtnText" Foreground="Aqua" FontWeight="Bold" FontSize="22" Content="共享文本" Checked="OnChecked" GroupName="g" Tag="text"/>
                        <RadioButton x:Name="radioBtnImg"  Foreground="Aqua" FontWeight="Bold" FontSize="22" Content="共享图像" Margin="12,0,0,0" Checked="OnChecked" GroupName="g" Tag="image"/>
                        <RadioButton x:Name="radioBtnFile"  Foreground="Aqua" FontWeight="Bold" FontSize="22" Content="共享文件" Margin="12,0,0,0" Checked="OnChecked" GroupName="g" Tag="file"/>
                    </StackPanel>

                    <StackPanel Name="stackPText" Visibility="Collapsed" Margin="8">
                        <TextBlock Text="共享文本" FontSize="25"/>
                        <TextBlock Foreground="Gold" FontSize="25" Text="输入要共享的内容" />
                        <TextBox x:Name="tBlockText" Foreground="Gold" />
                    </StackPanel>

                    <StackPanel Name="stackPImg" Visibility="Collapsed" Margin="8">
                        <TextBlock Text="共享图像" FontSize="25"/>
                        <TextBlock Foreground="Gold" FontSize="25" Text="共享以下图片"/>
                        <Image Width="600" Height="400" Stretch="UniformToFill" HorizontalAlignment="Left" 
                               Margin="1,5,0,5" Source="Assets/SpaceNeedle1.jpg"/>
                    </StackPanel>

                    <StackPanel Name="stackPFile" Visibility="Collapsed" Margin="8">
                        <TextBlock Text="共享文件" FontSize="28"/>
                        <TextBlock Foreground="Gold" FontSize="25" Text="选择要共享的文件"/>
                        <StackPanel>
                            <Button Content="选择文件" Click="OnPickFile"/>
                            <TextBlock x:Name="tBlockFile" Foreground="Gold" FontSize="24"/>
                        </StackPanel>
                    </StackPanel>                 
                </StackPanel>                                     
            </ScrollViewer>                                                                                                                                             
            <Button Grid.Row="2" Name="btnShare" Margin="12" Content="确定共享" FontSize="35" FontFamily="隶书" Foreground="Azure" Background="Black" Click="btnShare_Click"/>
        </Grid>

这里通过3个StackPanel的“显示“与”隐藏“来达到在一个位置显示3个界面的功能,然后在后台通过以下方法更改Visibility属性。

        private void OnChecked(object sender, RoutedEventArgs e)
        {
            RadioButton rbtn = sender as RadioButton;
            if (rbtn != null)
            {            
                string tag = rbtn.Tag.ToString();
                switch (tag)
                {
                    case "text":
                        this.stackPText.Visibility = Windows.UI.Xaml.Visibility.Visible;
                        this.stackPImg.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                        this.stackPFile.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                        break;
                    case "image":
                        this.stackPText.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                        this.stackPImg.Visibility = Windows.UI.Xaml.Visibility.Visible;
                        this.stackPFile.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                        break;
                    case "file":
                        this.stackPText.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                        this.stackPImg.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                        this.stackPFile.Visibility = Windows.UI.Xaml.Visibility.Visible;
                        break;
                    default:
                        this.stackPText.Visibility = Windows.UI.Xaml.Visibility.Visible;
                        this.stackPImg.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                        this.stackPFile.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                        break;
                }
            }
        }

以下是核心代码,通过RadioButton的选择来共享不同的内容。这里没有进行try、catch异常检测,但在实际工程中则是必要的,因为如果你不共享任何内容而点击共享按钮你就知道了……

         void MainPage_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
        {                       
            var deferral = args.Request.GetDeferral();
            if (radioBtnText.IsChecked == true) 
            {
                args.Request.Data.Properties.Title = "共享文本";
                args.Request.Data.Properties.Description = "共享你输入的文本数据。";
                args.Request.Data.SetText(this.tBlockText.Text);
            }
            else if (radioBtnImg.IsChecked == true)
            {
                args.Request.Data.Properties.Title = "共享图像";
                args.Request.Data.Properties.Description = "共享以下图片。";
                args.Request.Data.SetBitmap(Windows.Storage.Streams.RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/SpaceNeedle1.jpg")));
            }
            else if (radioBtnFile.IsChecked == true)
            {
                args.Request.Data.Properties.Title = "共享文件";
                args.Request.Data.Properties.Description = "共享你选择的文件。";          
                var file = this.tBlockFile.Tag as Windows.Storage.StorageFile;
                List<IStorageItem> files = new List<IStorageItem>();
                files.Add(file);
                args.Request.Data.SetStorageItems(files);
            }               
            deferral.Complete();
        }

选择文件的方法我们在前面也都介绍过了,直接贴代码……

         private async void OnPickFile(object sender, RoutedEventArgs e)
        {                         
            Windows.Storage.Pickers.FileOpenPicker picker = new Windows.Storage.Pickers.FileOpenPicker();
            picker.FileTypeFilter.Add(".mp3");
            picker.FileTypeFilter.Add(".jpg");
            picker.FileTypeFilter.Add(".png");
            picker.FileTypeFilter.Add(".docx");
            picker.FileTypeFilter.Add(".pptx");
            picker.FileTypeFilter.Add(".txt");
            Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
            if (file != null)
            {
                this.tBlockFile.Text = file.Path;                   
                this.tBlockFile.Tag = file;
            }
        }

当然了,记得下面这些操作……

       protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            DataTransferManager.GetForCurrentView().DataRequested += MainPage_DataRequested;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            DataTransferManager.GetForCurrentView().DataRequested -= MainPage_DataRequested;
        }

最后就是共享确认按钮了,一行代码搞定。

        private void btnShare_Click(object sender, RoutedEventArgs e)
        {
            DataTransferManager.ShowShareUI();
        }

以上这个App,你将需要共享的数据从这里发出,也叫共享源,但共享到哪里了呢?

这里写图片描述

看到”共享图像“和”共享以下图片“想起来刚才的两行代码了么?这两个属性就用在了这里。

args.Request.Data.Properties.Title = "共享文本";
args.Request.Data.Properties.Description = "共享你输入的文本数据。";

我们当然可以将数据共享到邮件、OneNote里,但如果你是要写一个自己的接收共享数据的应用呢,如何来写?

接下来就来写另一个App咯,也就是上图中的App49了。首先在清单文件中做如下操作,当然了,具体要添加哪些东西大家自己看着办就好了。

这里写图片描述

这里写图片描述

然后添加一个XAML页面来接收数据,因为你不可能只让你的APP专门用来接收数据咯,所以就不建议在MainPage中写了。

在新页面中大概做一下页面布局,我的布局通常来说都不是很美观的……

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="100"/>
        </Grid.RowDefinitions>

        <Grid x:Name="gridText" Margin="24" Visibility="Collapsed" Grid.Row="0">
            <StackPanel>
                <TextBlock FontSize="25" Foreground="Red" Text="接收到的文本:"/>
                <TextBlock FontSize="30" Foreground="Pink" FontWeight="Bold" x:Name="tbText" Margin="8"/>
            </StackPanel>
        </Grid>

        <Grid x:Name="gridImg" Margin="25" Visibility="Collapsed" Grid.Row="0">
            <StackPanel>
                <TextBlock FontSize="25" Foreground="Red" Text="接收到的图像:"/>
                <Image x:Name="img" Margin="12" Width="500" Height="400" HorizontalAlignment="Left" Stretch="Uniform"/>
            </StackPanel>
        </Grid>

        <Grid x:Name="gridStorageItems" Margin="25" Visibility="Collapsed" Grid.Row="0">
            <StackPanel>
                <TextBlock FontSize="25"  Foreground="Red" Text="接收到的文件:"/>
                <TextBlock FontSize="30" Margin="12" x:Name="tbStorageItem"/>
            </StackPanel>
        </Grid>

        <Button Grid.Row="1" HorizontalAlignment="Center" Margin="0,15,0,20" 
                Content="完成共享" FontSize="28" Width="200" Click="btnCompleteShare_Click"/>
    </Grid>

后台代码中写以下代码,核心在于if中的3个判断,就是3中共享的文件了咯。

  public sealed partial class ShareTargetPage : Page
    {
        ShareOperation shareOperation = null;
        public ShareTargetPage()
        {
            this.InitializeComponent();
        }

        protected async override void OnNavigatedTo(NavigationEventArgs e)
        {
            ShareOperation sp = e.Parameter as ShareOperation;
            if (sp != null)
            {
                this.shareOperation = sp;
                DataPackageView pack = sp.Data;
                if (pack.Contains(StandardDataFormats.Text))
                {                                             
                    string s = await pack.GetTextAsync();
                    this.tbText.Text = s;
                    this.gridText.Visibility = Windows.UI.Xaml.Visibility.Visible;
                }
                else if (pack.Contains(StandardDataFormats.Bitmap))
                {                                       
                    var stream = await pack.GetBitmapAsync();

                    BitmapImage bmp = new BitmapImage();
                    bmp.SetSource(await stream.OpenReadAsync());
                    this.img.Source = bmp;
                    this.gridImg.Visibility = Windows.UI.Xaml.Visibility.Visible;
                }
                else if (pack.Contains(StandardDataFormats.StorageItems))
                {                                                
                    var storageItems = await pack.GetStorageItemsAsync();
                    StorageFile file = storageItems[0] as StorageFile;

                    this.tbStorageItem.Text = file.Name;
                    this.gridStorageItems.Visibility = Windows.UI.Xaml.Visibility.Visible;
                }
            }
        }

        private void btnCompleteShare_Click(object sender, RoutedEventArgs e)
        {                         
            this.shareOperation.ReportCompleted();
        }
    }

接着我们就要来调试这两个程序啦。只需要将接受共享数据的App按F5运行后关掉就好了,因为它会部署到本地的,或者也可以在Build选项卡中直接部署也是一样的。然后按F5运行共享数据的数据源App就好啦。

截图如下:

这里写图片描述

这张图片我压缩过了,不如太大上传不了,所以可能看不清楚吧。下面是共享文本数据的过程截图啦。

这里写图片描述

这里写图片描述

这里写图片描述

这个是共享图像的截图,忘了说了,在前面的SpaceNeedle1.jpg就是下面这张图片我已经事先添加到工程里了的。

这里写图片描述

紧接着我们共享这个docx文件,却发现在共享栏里没有了App49,发生了什么?

这里写图片描述

这里写图片描述

下面这首刚才添加的受支持的文件类型,明显没有添加.docx,所以这也是一个需要注意的地方。

这里写图片描述

这样我们的APP就具备了共享数据的本领了,下一篇我们再看看如何使用Toast通知和利用开始菜单的图标来显示一些应用信息。

目录
相关文章
|
17天前
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
36 2
|
21天前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
23天前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
43 0
|
28天前
|
开发框架 监控 搜索推荐
GoFly快速开发框架集成ZincSearch全文搜索引擎 - Elasticsearch轻量级替代为ZincSearch全文搜索引擎
本文介绍了在项目开发中使用ZincSearch作为全文搜索引擎的优势,包括其轻量级、易于安装和使用、资源占用低等特点,以及如何在GoFly快速开发框架中集成和使用ZincSearch,提供了详细的开发文档和实例代码,帮助开发者高效地实现搜索功能。
110 0
|
2月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
149 0
|
3月前
|
开发者 存储 API
Xamarin 云服务集成竟然如此强大,简化后端开发不再是梦,数据存储、用户认证、推送通知全搞定!
【8月更文挑战第31天】Xamarin 是一款强大的跨平台移动应用开发工具,通过与云服务集成,显著简化了后端开发。开发者无需自行搭建服务器,即可利用云服务提供的数据存储、用户认证、推送通知等功能,大幅减少数据库设计、服务器配置及 API 开发的时间成本。借助 Azure Mobile Apps 等云服务,Xamarin 可轻松实现数据存取操作,同时增强应用安全性与用户参与度,使开发者更专注于业务逻辑和用户体验,提升开发效率并降低成本。这种方式在快速发展的移动应用领域极具价值。
56 0
|
3月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
182 0
|
3月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
43 0
|
3月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
60 0
|
3月前
|
前端开发 Devops 持续交付
【前端自动化新高度】Angular与Azure DevOps完美结合:从零构建持续集成与持续部署的全自动流水线,提升开发效率与软件交付质量!
【8月更文挑战第31天】Angular作为领先的前端框架,以强大功能和灵活性深受开发者喜爱。Azure DevOps提供一站式DevOps服务,涵盖源码管理、持续集成(CI)及持续部署(CD)。本文将指导你如何在Azure DevOps中搭建Angular项目的CI/CD流程,并通过具体示例代码展示整个过程。首先,我们将创建一个Angular项目并初始化Git仓库;然后,在Azure DevOps中设置CI流水线,定义YAML文件以自动化构建和部署流程。最终实现每次提交代码后自动构建并部署至Azure Web App,极大提升了开发效率和软件交付速度,使团队更专注于创新。
34 0

热门文章

最新文章