WPF上下滾動字幕

来源:http://www.cnblogs.com/s0611163/archive/2017/10/09/7641153.html
-Advertisement-
Play Games

XAML代碼: <local:WorkSpaceContent x:Class="SunCreate.CombatPlatform.Client.NoticeMarquee" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentati ...


XAML代碼:

<local:WorkSpaceContent x:Class="SunCreate.CombatPlatform.Client.NoticeMarquee"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:SunCreate.CombatPlatform.Client;assembly=SunCreate.CombatPlatform.Client"
             mc:Ignorable="d" 
             d:DesignHeight="35" d:DesignWidth="300" Loaded="WorkSpaceContent_Loaded" MouseEnter="WorkSpaceContent_MouseEnter" MouseLeave="WorkSpaceContent_MouseLeave">
    <local:WorkSpaceContent.Resources>
        <ControlTemplate x:Key="btnTemplate" TargetType="Button">
            <TextBlock Name="txt" Margin="5 0 5 0" Text="{TemplateBinding Content}" FontSize="12" Cursor="Hand" ToolTip="{TemplateBinding ToolTip}" Foreground="#fff" VerticalAlignment="Center"></TextBlock>
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter TargetName="txt" Property="Foreground" Value="#ff5e5e"></Setter>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
        <Storyboard x:Key="storyboard">
            <DoubleAnimation  Duration="0:0:1" To="25" Storyboard.TargetName="stackPanel" Storyboard.TargetProperty="RenderTransform.Y"/>
        </Storyboard>
    </local:WorkSpaceContent.Resources>
    <Grid Background="#00a6da">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="60"></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBlock Margin="15 0 5 0" Text="公告:" FontSize="12"  Foreground="#ffff33" VerticalAlignment="Center"></TextBlock>
        <ScrollViewer Grid.Column="1" Name="scrollViewer" HorizontalScrollBarVisibility="Hidden"
                      HorizontalContentAlignment="Stretch"
                      VerticalScrollBarVisibility="Hidden"
                       VerticalContentAlignment="Stretch" Height="25">
            <Border Height="25" >
                <StackPanel x:Name="stackPanel" Margin="0 -25 0 0" >
                    <StackPanel.RenderTransform>
                        <TranslateTransform />
                    </StackPanel.RenderTransform>
                    <Button Name="btn1" Height="25" Click="btn_Click" Template="{StaticResource btnTemplate}"></Button>
                    <Button Name="btn2" Height="25" Click="btn_Click" Template="{StaticResource btnTemplate}"></Button>
                    <Button Name="btn3" Height="25" Click="btn_Click" Template="{StaticResource btnTemplate}"></Button>
                </StackPanel>
            </Border>
        </ScrollViewer>
    </Grid>
</local:WorkSpaceContent>
View Code

後臺代碼:

using SunCreate.CombatPlatform.Domain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace SunCreate.CombatPlatform.Client
{
    /// <summary>
    /// 公告滾動顯示
    /// </summary>
    public partial class NoticeMarquee : WorkSpaceContent
    {
        private System.Timers.Timer _timer;
        private List<TES_NOTICE> _data;
        private int _index;
        private Storyboard _storyboard;

        public NoticeMarquee()
        {
            InitializeComponent();
        }

        private void WorkSpaceContent_Loaded(object sender, RoutedEventArgs e)
        {
            if (_timer == null)
            {
                _storyboard = (Storyboard)this.FindResource("storyboard");

                System.Threading.Tasks.Task.Factory.StartNew(() =>
                {
                    while (true)
                    {
                        int total = 0;
                        _data = HI.Get<INoticeService>().GetListPage(null, DateTime.MinValue, DateTime.Now, 1, 3, ref total).ToList();
                        _data.Reverse();
                        _index = _data.Count - 1;
                        Dispatcher.BeginInvoke(new Action(() =>
                        {
                            stackPanel.RenderTransform = new TranslateTransform(0, 25);
                        }));
                        ShowData();
                        Thread.Sleep(60 * 1000);
                    }
                });

                _timer = new System.Timers.Timer();
                _timer.Interval = 5000;
                _timer.Elapsed += Action;
                _timer.Start();
            }
        }

        private void Action(object sender, ElapsedEventArgs e)
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                stackPanel.RenderTransform = new TranslateTransform(0, 0);
                _storyboard.Begin();
            }));

            _index--;
            if (_index < 0)
            {
                _index = _data.Count - 1;
            }

            ShowData();
        }

        private void ShowData()
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                TES_NOTICE data1 = GetData(_index, 0);
                TES_NOTICE data2 = GetData(_index, 1);
                TES_NOTICE data3 = GetData(_index, 2);

                if (data1 != null)
                {
                    btn1.Content = data1.NOTICE_CONTENT.Trim().Replace("\r\n", string.Empty);
                    btn1.CommandParameter = data1.ID;
                    btn1.ToolTip = data1.NOTICE_CONTENT;
                }

                if (data2 != null)
                {
                    btn2.Content = data2.NOTICE_CONTENT.Trim().Replace("\r\n", string.Empty);
                    btn2.CommandParameter = data2.ID;
                    btn2.ToolTip = data2.NOTICE_CONTENT;
                }

                if (data3 != null)
                {
                    btn3.Content = data3.NOTICE_CONTENT.Trim().Replace("\r\n", string.Empty);
                    btn3.CommandParameter = data3.ID;
                    btn3.ToolTip = data3.NOTICE_CONTENT;
                }
            }));
        }

        private TES_NOTICE GetData(int index, int n)
        {
            if (_data != null)
            {
                int i = index + n;
                if (i > _data.Count - 1)
                {
                    i = i % _data.Count;
                }
                return _data[i];
            }
            return null;
        }

        private void WorkSpaceContent_MouseEnter(object sender, MouseEventArgs e)
        {
            _timer.Stop();
        }

        private void WorkSpaceContent_MouseLeave(object sender, MouseEventArgs e)
        {
            _timer.Start();
        }

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            Button btn = e.Source as Button;
            string dataId = btn.CommandParameter.ToString();
            NoticeView noticeView = new NoticeView(dataId);
            noticeView.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            noticeView.ShowDialog();
        }
    }
}
View Code

效果圖:

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在講vim編輯器之前,我們要先明白為什麼要學vim編輯器。系統管理員的重要工作就是要修改與設定某些重要軟體的配置文件,因此至少要學會一種以上的文字介面的文書編輯器。 現在開始正式學習vim編輯器。基本上vim共分為三種模式,分別是一般模式,編輯模式,與指令列模式,這三種模式的作用分別是: 1)一般模 ...
  • 首先解釋下:本文只是對Asp.net MVC4高級編程這本書學習記錄的學習筆記,書本內容感覺挺簡單的,但學習容易忘記,因此在邊看的同時邊作下了筆記,可能其它朋友看的話沒有情境和邏輯順序還請諒解! 一、MVC控制器渲染視圖的三種方式。 如下以HomeController控制器中的代碼為例: 1、預設方 ...
  • 局部函數是C 7中的一個新功能,允許在一個函數中定義另一個函數。 何時使用局部函數? 局部函數的主要功能與匿名方法非常相似:在某些情況下,創建一個命名函數在讀者的認知負擔方面代價太大。有時,函數本身就是另一個函數的部分邏輯,因此用一個單獨的命名實體來污染“外部”範圍是毫無意義的。 您可能認為此功能是 ...
  • 在數值字元串的格式化中有很多格式化的格式,比如:用"C"表示貨幣格式,用"P"表示百分比格式,FCL中支持多種格式化字元串的方式。有時候我們會把一個數值轉換成string類型,然後再從string類型轉換成數值類型,這時候就要考慮轉換回來後的數值會不會和原來的相等呢? 首先的一種情況: 使用G常規格 ...
  • 基於ffmpeg和虹軟人臉識別庫的C#開源實現,對虹軟人臉識別庫進行了包裝,便於在C#中快速、安全的調用識別函數。同時,開源代碼中,包含完整的實現示例。 ...
  • 本篇作為技術分享系列的第四篇,詳細講一下手繪視頻中 Surface Pen 和 Surface Dial 的使用場景。 先放一張微軟官方商城的圖,Surface 的使用中結合了 Surface Pen 和 Surface Dial。 Surface Pen 的使用場景不難想象,就像 iPad 和 A ...
  • DataRead 和DataSet區別 dataset表示一個數據集,是數據在記憶體中的緩存。 可以包括多個表DatSet 連接資料庫時是非面向連接的。把表全部讀到Sql中的緩衝池,並斷開於資料庫的連接 datareader 連接資料庫時是面向連接的。讀表時,只能向前讀取,讀完數據後有用戶決定是否斷開 ...
  • C# 的集合類型中, 都有Synchronized靜態方法, 和SyncRoot實例方法 對於ArrayList以及Hashtable 集合類來講,當需要做到線程安全的時候,最好利用其自帶的屬性SyncRoot 來做到,儘管也可以使用其Synchronized()方法來實現,但是使用屬性會更好。 線 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...