我想创建一个类似于Android屏幕的窗口,显示蓝牙状态,wifi ..等等。我有一个类检查所述设备的状态,并返回一个字节值0表示关闭,1表示打开,0xFF表示错误。然后我做了一个Button(可能应该是ToggleButton ......但我对WPF来说很新)
public class ToggleTaskButton : System.Windows.Controls.Primitives.ButtonBase
{
public ImageSource ImageSource
{
get { return (ImageSource)GetValue(ImageSourceProperty); }
set { SetValue(ImageSourceProperty, value); }
}
public Color MyBackgroundColor
{
get { return (Color)GetValue(MyBackgroundColorProperty); }
set { SetValue(MyBackgroundColorProperty, value); }
}
// Using a DependencyProperty as the backing store for MyBackgroundColor. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyBackgroundColorProperty =
DependencyProperty.Register("MyBackgroundColor", typeof(Color), typeof(ToggleTaskButton), new PropertyMetadata(null));
// Using a DependencyProperty as the backing store for ImageSource. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ImageSourceProperty =
DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(ToggleTaskButton), new UIPropertyMetadata(null));
}
关于上面那个类的说明是我认为我不想要依赖属性?相反,我宁愿设置一个值,背景颜色也会变为适当的颜色。 0表示灰色,1表示绿色> 1表示红色。有一件事我不知道怎么做
然后我创建了一个Bluetooth UserControl,然后将类型更改为ToggleTaskButton。这个项目只是一个类库,所以我没有获得资源字典:/我试图让按钮点击部分在我发布之前正常工作。抱歉这个烂摊子。
<ata:ToggleTaskButton x:Class="AdvancedTaskAssigner.Controls.BluetoothControl"
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:ata="clr-namespace:AdvancedTaskAssigner.Controls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Loaded="UserControl_Loaded" Click="ToggleTaskButton_Click"
ImageSource="/AdvancedTaskAssigner;component/Resources/Bluetooth.png" MyBackgroundColor="Green">
<ata:ToggleTaskButton.Resources>
<Style TargetType="{x:Type ata:ToggleTaskButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ata:ToggleTaskButton}">
<Viewbox>
<Grid>
<Border BorderBrush="#FF58595B" BorderThickness="15,15,15,15" CornerRadius="8,8,8,8" >
<Border.Background>
<RadialGradientBrush>
<GradientStop Color="#FFB2B2B2" Offset=".75"/>
<GradientStop Offset="1" Color="#FFB2B2B2" />
</RadialGradientBrush>
</Border.Background>
<Viewbox>
<Image Margin="25" Height="100" Width="100" Source="{TemplateBinding ImageSource}" />
</Viewbox>
</Border>
</Grid>
</Viewbox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ata:ToggleTaskButton.Resources>
</ata:ToggleTaskButton>
代码背后
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace AdvancedTaskAssigner.Controls
{
/// <summary>
/// Interaction logic for BluetoothControl.xaml
/// </summary>
public partial class BluetoothControl : ToggleTaskButton
{
public BluetoothControl()
{
InitializeComponent();
task = new BrightnessTask();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
CheckBluetoothState();
System.Console.Beep(1000, 100);
}
private void CheckBluetoothState()
{
//bluetoothState = ((byte)task.GetState() == 0x01);
//Color c = bluetoothState ? (Color)FindResource("enabledColor") : (Color)FindResource("disabledColor");
//this.outsideColor.Color = c;
}
private BrightnessTask task;
private bool bluetoothState = false;
private void ToggleTaskButton_Click(object sender, RoutedEventArgs e)
{
if (bluetoothState) { task.PerformTaskDown(); MessageBox.Show("BOO"); System.Console.Beep(1000, 100); } //if bluetooth enabled..disable
else { task.PerformTaskUp(); System.Console.Beep(2000, 100); MessageBox.Show("BOO"); }//if bluetooth disabled..enable.
CheckBluetoothState();
}
}
}
所以我最终不知道自己在做什么。我希望这是WPF,因为我需要处理各种各样的平板电脑和各种屏幕尺寸。我在想OnLoad控件应该使用蓝牙任务来设置状态。设置状态后,它会更改边框背景上第二个渐变色标的颜色。请帮忙。如何设置GradientStop的颜色?当我将这个控件添加到WPF应用程序中的UserControl时它什么也没显示,但在我的设计器中它显示了这3个按钮中的一个
答案 0 :(得分:1)
我创建了一个附加依赖项属性CurrentStatus
的示例,其中包含连接的当前状态。我还为Button
触发器创建了一个模板,用于设置Button
的属性,具体取决于状态。在Button
可以有三种状态,并且添加新状态并不困难。
按钮样式示例:
<Style x:Key="BlueToothButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Gainsboro" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="FontSize" Value="15" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="2" Background="{TemplateBinding Background}">
<Grid>
<ContentPresenter x:Name="MyContentPresenter" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0" />
<Path x:Name="Bicon" Width="15" Height="27" Stretch="Fill" Fill="#FF000000" Data="F1 M 51,47L 36,61L 36,43L 28.25,50L 25.25,46.75L 35,38L 25.25,29.25L 28.25,26L 36,32L 36,14L 51,29L 42,38L 51,47 Z M 41,43L 41,50.5L 44.5,46.5L 41,43 Z M 41,33L 44.5,29.5L 41,25.3995L 41,33 Z "/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(local:DepClass.CurrentStatus)}" Value="1">
<Setter Property="Background" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(local:DepClass.CurrentStatus)}" Value="2">
<Setter Property="Background" Value="Red" />
<Setter Property="Foreground" Value="White" />
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#E59400" />
<Setter TargetName="Bicon" Property="Fill" Value="White" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
此处DataTrigger
设置状态值:
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(local:DepClass.CurrentStatus)}" Value="1">
<Setter Property="Background" Value="Green" />
</DataTrigger>
触发器也可以如下所示:
<Trigger Property="local:DepClass.CurrentStatus" Value="1">
<Setter Property="Background" Value="#E59400" />
</Trigger>
这将是相同的。
Output
状态0
:
状态1
:
状态2
:
DependencyProperty
的列表:
public class DepClass : DependencyObject
{
public static readonly DependencyProperty CurrentStatusProperty;
public static void SetCurrentStatus(DependencyObject DepObject, int value)
{
DepObject.SetValue(CurrentStatusProperty, value);
}
public static int GetCurrentStatus(DependencyObject DepObject)
{
return (int)DepObject.GetValue(CurrentStatusProperty);
}
static DepClass()
{
PropertyMetadata MyPropertyMetadata = new PropertyMetadata(0);
CurrentStatusProperty = DependencyProperty.RegisterAttached("CurrentStatus",
typeof(int),
typeof(DepClass),
MyPropertyMetadata);
}
}
状态以这种方式定义:
DepClass.SetCurrentStatus(BluetoothButton, 1);
或者像这样的XAML:
<Button local:DepClass.CurrentStatus="0" ... />
完整示例:
XAML
<Window x:Class="BluetoothButtonHelp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BluetoothButtonHelp"
Title="MainWindow" Height="350" Width="525"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<Style x:Key="BlueToothButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Gainsboro" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="FontSize" Value="15" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="2" Background="{TemplateBinding Background}">
<Grid>
<ContentPresenter x:Name="MyContentPresenter" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0" />
<Path x:Name="Bicon" Width="15" Height="27" Stretch="Fill" Fill="#FF000000" Data="F1 M 51,47L 36,61L 36,43L 28.25,50L 25.25,46.75L 35,38L 25.25,29.25L 28.25,26L 36,32L 36,14L 51,29L 42,38L 51,47 Z M 41,43L 41,50.5L 44.5,46.5L 41,43 Z M 41,33L 44.5,29.5L 41,25.3995L 41,33 Z "/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(local:DepClass.CurrentStatus)}" Value="1">
<Setter Property="Background" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(local:DepClass.CurrentStatus)}" Value="2">
<Setter Property="Background" Value="Red" />
<Setter Property="Foreground" Value="White" />
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#E59400" />
<Setter TargetName="Bicon" Property="Fill" Value="White" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Button Name="BluetoothButton" Style="{StaticResource BlueToothButtonStyle}" local:DepClass.CurrentStatus="0" Width="40" Height="40" />
<Button Name="Status1" Content="Status 1" Width="100" Height="30" HorizontalAlignment="Left" Click="Status1_Click" />
<Button Name="Status2" Content="Status 2" Width="100" Height="30" HorizontalAlignment="Right" Click="Status2_Click" />
<Button Name="Status0" Content="Status 0" Width="100" Height="30" VerticalAlignment="Top" Click="Status0_Click" />
</Grid>
</Window>
Code behind
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Status1_Click(object sender, RoutedEventArgs e)
{
DepClass.SetCurrentStatus(BluetoothButton, 1);
}
private void Status2_Click(object sender, RoutedEventArgs e)
{
DepClass.SetCurrentStatus(BluetoothButton, 2);
}
private void Status0_Click(object sender, RoutedEventArgs e)
{
DepClass.SetCurrentStatus(BluetoothButton, 0);
}
}
public class DepClass : DependencyObject
{
public static readonly DependencyProperty CurrentStatusProperty;
public static void SetCurrentStatus(DependencyObject DepObject, int value)
{
DepObject.SetValue(CurrentStatusProperty, value);
}
public static int GetCurrentStatus(DependencyObject DepObject)
{
return (int)DepObject.GetValue(CurrentStatusProperty);
}
static DepClass()
{
PropertyMetadata MyPropertyMetadata = new PropertyMetadata(0);
CurrentStatusProperty = DependencyProperty.RegisterAttached("CurrentStatus",
typeof(int),
typeof(DepClass),
MyPropertyMetadata);
}
}