1. 程式人生 > >wpf banner控件的封裝

wpf banner控件的封裝

loaded gen xmlns nav ans eval name ati override

一、創建BannerAD用戶控件

一個Banner用戶控件可以包含n個BannerAD用戶控件,在此創建2個BannerAD用戶控件作為示例;

BannerAD1.xaml

<UserControl x:Class="WpfApp.BannerAD1"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Border Name="bor">
        <Border.Background>
            <ImageBrush ImageSource="/images/test1.jpg" Stretch="Fill" RenderOptions.BitmapScalingMode="Fant"></ImageBrush>
        </Border.Background>
    </Border>
</UserControl>

BannerAD1.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp
{
    /// <summary>
    /// BannerAD1.xaml 的交互邏輯
    /// </summary>
    public partial class BannerAD1 : UserControl, IStop
    {
        public BannerAD1()
        {
            InitializeComponent();
        }

        public bool Stopped
        {
            get
            {
                return bor.IsMouseOver;
            }
        }
    }
}

BannerAD2.xaml

<UserControl x:Class="WpfApp.BannerAD2"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Border Name="bor">
        <Border.Background>
            <ImageBrush ImageSource="/images/test2.jpg" Stretch="Fill" RenderOptions.BitmapScalingMode="Fant"></ImageBrush>
        </Border.Background>
    </Border>
</UserControl>

BannerAD2.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp
{
    /// <summary>
    /// BannerAD2.xaml 的交互邏輯
    /// </summary>
    public partial class BannerAD2 : UserControl, IStop
    {
        public BannerAD2()
        {
            InitializeComponent();
        }

        public bool Stopped
        {
            get
            {
                return bor.IsMouseOver;
            }
        }
    }
}

二、創建BoolVisibilityConverter類

BoolVisibilityConverter.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace WpfApp
{
    [ValueConversion(typeof(bool), typeof(Visibility))]
    class BoolVisibilityConverter : MarkupExtension, IValueConverter
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return new BoolVisibilityConverter { FromType = this.FromType ?? typeof(bool), TargetType = this.TargetType ?? typeof(Visibility), Parameter = this.Parameter };
        }

        public object Parameter { get; set; }
        public Type TargetType { get; set; }
        public Type FromType { get; set; }

        #region IValueConverter成員
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Visibility result = Visibility.Hidden;
            if (value is bool)
            {
                if ((bool)value)
                    result = Visibility.Visible;
            }
            return result;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is Visibility)
            {
                if ((Visibility)value == Visibility.Visible)
                    return true;
                else
                    return false;
            }
            return false;
        }
        #endregion
    }
}

三、創建Banner用戶控件

Banner.xaml

<UserControl x:Class="WpfApp.Banner"
             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" 
             mc:Ignorable="d" 
             xmlns:local="clr-namespace:WpfApp" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <Style TargetType="RadioButton">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="RadioButton">
                        <Grid>
                            <Ellipse Fill="Transparent" Stroke="#606e7e" x:Name="Bot" Width="8" Height="8" VerticalAlignment="Center" HorizontalAlignment="Center"></Ellipse>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter TargetName="Bot" Property="Fill" Value="#606e7e"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
    <Grid>
        <Grid  x:Name="ADGrid">
            <local:BannerAD1 Visibility="{Binding ElementName=Btn1,Path=IsChecked,Mode=OneWay,Converter={local:BoolVisibilityConverter}}"></local:BannerAD1>
            <local:BannerAD2 Visibility="{Binding ElementName=Btn2,Path=IsChecked,Mode=OneWay,Converter={local:BoolVisibilityConverter}}"></local:BannerAD2>
        </Grid>
        <StackPanel x:Name="buttonPanel" Panel.ZIndex="1" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,0,0,10" Orientation="Horizontal">
            <RadioButton x:Name="Btn2" Margin="5,0,5,0" MouseEnter="RadioButton_MouseEnter" IsChecked="True"></RadioButton>
            <RadioButton x:Name="Btn1" Margin="5,0,5,0" MouseEnter="RadioButton_MouseEnter"></RadioButton>
        </StackPanel>
    </Grid>
</UserControl>

Banner.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace WpfApp
{
    /// <summary>
    /// Banner.xaml 的交互邏輯
    /// </summary>
    public partial class Banner : UserControl
    {
        List<RadioButton> radioButtons = new List<RadioButton>();
        List<IStop> iStops = new List<IStop>();
        DispatcherTimer timer = new DispatcherTimer();

        public Banner()
        {
            InitializeComponent();
            this.Loaded += Banner_Loaded;
        }

        private void Banner_Loaded(object sender, RoutedEventArgs e)
        {
            foreach (var ele in this.buttonPanel.Children)
            {
                RadioButton rbtn = ele as RadioButton;
                if (rbtn != null)
                    radioButtons.Add(rbtn);
            }
            foreach (var ele in this.ADGrid.Children)
            {
                IStop iStop = ele as IStop;
                if (iStop != null)
                    iStops.Add(iStop);
            }
            if (radioButtons.Count > 1)
            {
                timer.Interval = new TimeSpan(0, 0, 5);
                timer.Tick += Timer_Tick;
                timer.Start();
            }
            
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            if (iStops.Any(c => c.Stopped))
                return;
            int currentIndex = 0;
            for (int i = 0; i < this.radioButtons.Count; i++)
            {
                if (this.radioButtons[i].IsChecked == true)
                {
                    if (this.radioButtons[i].IsMouseOver)
                        currentIndex = -1;
                    else
                        currentIndex = i;
                    break;
                }
            }
            if (currentIndex != -1)
            {
                while (true)
                {
                    currentIndex++;
                    if (currentIndex == this.radioButtons.Count)
                        currentIndex = 0;
                    if (this.radioButtons[currentIndex].Visibility == Visibility.Visible)
                    {
                        this.radioButtons[currentIndex].IsChecked = true;
                        break;
                    }
                }
            }
        }

        private void RadioButton_MouseEnter(object sender, MouseEventArgs e)
        {
            RadioButton rbtn = sender as RadioButton;
            rbtn.IsChecked = true;
        }
    }

    public interface IStop
    {
        bool Stopped { get; }
    }
}

四、使用Banner用戶控件

創建一個Window窗體,在窗體的xaml文件中添加命名空間(xmlns:local="clr-namespace:WpfApp")和Banner用戶控件(<local:Banner></local:Banner>);

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="4*"></RowDefinition>
            <RowDefinition Height="3*"></RowDefinition>
        </Grid.RowDefinitions>
        <local:Banner></local:Banner>
    </Grid>
</Window>

  

wpf banner控件的封裝