【萬里征程——Windows App開發】如何使用貼上板

nomasp發表於2015-05-17

記得智慧手機剛出來那會比較火的一個概念“能夠複製貼上的手機就是智慧手機”。現在看來,這不過是個老掉牙的功能了,但實際用處卻是非常強大的,那麼現在我們就來試試怎麼做到這個功能。

貼上板的英文名叫做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;
            }
        }
    }

現在它還可以複製圖片了哦~

這裡寫圖片描述



感謝您的訪問,希望對您有所幫助。 歡迎大家關注、收藏以及評論。


為使本文得到斧正和提問,轉載請註明出處:
http://blog.csdn.net/nomasp


相關文章