WPF高级用法示例

WPF高级用法示例

一、MVVM模式深度实现

1. 命令模式扩展

 
  
// RelayCommand.cs - 支持CanExecuteChanged事件和参数
public class RelayCommand : ICommand
{
    private readonly Action _execute;
    private readonly Predicate _canExecute;

    public RelayCommand(Action execute, Predicate canExecute = null)
    {
        _execute = execute ?? throw new ArgumentNullException(nameof(execute));
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);

    public void Execute(object parameter) => _execute(parameter);

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    // 强制重新评估CanExecute
    public void RaiseCanExecuteChanged() => 
        CommandManager.InvalidateRequerySuggested();
} 
  

2. ViewModel基类

 
  
// ViewModelBase.cs - 实现INotifyPropertyChanged和IDisposable
public abstract class ViewModelBase : INotifyPropertyChanged, IDisposable
{
    private bool _disposed = false;

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    protected bool SetField(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        if (EqualityComparer.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                // 释放托管资源
            }
            _disposed = true;
        }
    }

    ~ViewModelBase() => Dispose(false);
}

3. 异步命令实现

 
  
// AsyncRelayCommand.cs - 支持异步操作
public class AsyncRelayCommand : ICommand
{
    private readonly Func _execute;
    private readonly Predicate _canExecute;
    private bool _isExecuting;

    public AsyncRelayCommand(Func execute, Predicate canExecute = null)
    {
        _execute = execute ?? throw new ArgumentNullException(nameof(execute));
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter) => !_isExecuting && (_canExecute == null || _canExecute(parameter));

    public async void Execute(object parameter)
    {
        if (CanExecute(parameter))
        {
            try
            {
                _isExecuting = true;
                RaiseCanExecuteChanged();
                await _execute(parameter);
            }
            finally
            {
                _isExecuting = false;
                RaiseCanExecuteChanged();
            }
        }
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void RaiseCanExecuteChanged() => 
        CommandManager.InvalidateRequerySuggested();
} 
  

二、高级数据绑定技术

1. 多绑定与转换器

 
  


    
        
            
            
        
    



public class FullNameConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values[0] is string firstName && values[1] is string lastName)
            return $"{firstName} {lastName}";
        return string.Empty;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

2. 动态数据模板

 
  

public class ItemTypeTemplateSelector : DataTemplateSelector
{
    public DataTemplate TextTemplate { get; set; }
    public DataTemplate ImageTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is TextItem) return TextTemplate;
        if (item is ImageItem) return ImageTemplate;
        return base.SelectTemplate(item, container);
    }
}



    



    



    
        
    

三、自定义控件开发

1. 自定义控件基类

 
  
// CustomControlBase.cs - 提供通用功能
public abstract class CustomControlBase : Control
{
    static CustomControlBase()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControlBase), 
            new FrameworkPropertyMetadata(typeof(CustomControlBase)));
    }

    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        // 模板应用后的初始化
    }
}

2. 高级自定义控件示例

 
  



// 需要添加的依赖属性
public class AdvancedProgressBar : Control
{
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(double), typeof(AdvancedProgressBar),
            new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender));

    public double Value
    {
        get => (double)GetValue(ValueProperty);
        set => SetValue(ValueProperty, value);
    }
}

四、高级动画技术

1. 关键帧动画

 
  


    
        
            
            
            
            
        
    



2. 自定义缓动函数

 
  
// 自定义缓动函数
public class ElasticEaseConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double progress && targetType == typeof(double))
        {
            // 实现弹性缓动效果
            return Math.Sin(progress * Math.PI * (0.2f + 2.5f * progress * progress * progress)) 
                   * Math.Pow(1f - progress, 2.2f) + progress;
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}



    
        
    

五、高级数据可视化

1. 自定义图表控件

 
  


    
        
            
        
    
    
        
    



    
    

2. 高级数据绑定示例

 
  


    
        
            
            
            
        
    


// 转换器实现
public class ComplexConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values[0] is decimal total && values[1] is decimal discount && 
            values[2] is string currency)
        {
            var finalAmount = total - discount;
            return $"{currency}{finalAmount:F2}";
        }
        return "N/A";
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

六、性能优化技术

1. 虚拟化列表

 
  


    
        
            
        
    

2. 异步数据加载

 
  
// ViewModel中的异步数据加载
public class DataViewModel : ViewModelBase
{
    private ObservableCollection _items = new ObservableCollection();
    public ObservableCollection Items => _items;

    public async Task LoadDataAsync()
    {
        IsLoading = true;
        try
        {
            var data = await DataService.GetDataAsync();
            _items.Clear();
            foreach (var item in data)
            {
                _items.Add(item);
            }
        }
        finally
        {
            IsLoading = false;
        }
    }

    private bool _isLoading;
    public bool IsLoading
    {
        get => _isLoading;
        set => SetField(ref _isLoading, value);
    }
}

七、高级主题与样式

1. 动态主题切换

 
  


    
    


// 动态切换主题
public static class ThemeManager
{
    public static void ApplyTheme(string themeName)
    {
        var dict = new ResourceDictionary
        {
            Source = new Uri($"Themes/{themeName}.xaml", UriKind.Relative)
        };
        
        Application.Current.Resources.MergedDictionaries.Clear();
        Application.Current.Resources.MergedDictionaries.Add(dict);
    }
}

2. 自定义控件样式

 
  




八、高级布局技术

1. 自定义面板

 
  
// 自定义流式面板
public class FlowPanel : Panel
{
    public static readonly DependencyProperty OrientationProperty =
        DependencyProperty.Register("Orientation", typeof(Orientation), typeof(FlowPanel),
            new FrameworkPropertyMetadata(Orientation.Horizontal, 
                FrameworkPropertyMetadataOptions.AffectsArrange));

    public Orientation Orientation
    {
        get => (Orientation)GetValue(OrientationProperty);
        set => SetValue(OrientationProperty, value);
    }

    protected override Size MeasureOverride(Size availableSize)
    {
        // 测量逻辑...
        return base.MeasureOverride(availableSize);
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        // 排列逻辑...
        return base.ArrangeOverride(finalSize);
    }
}

2. 复杂布局示例

 
  


    
        
        
        
    
    
    
        
        

九、高级调试技术

1. 可视化树调试

 
  
// 获取可视化树结构
public static void PrintVisualTree(DependencyObject parent, int level = 0)
{
    var indent = new string(' ', level * 2);
    Debug.WriteLine($"{indent}{parent.GetType().Name}");
    
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        PrintVisualTree(VisualTreeHelper.GetChild(parent, i), level + 1);
    }
}

// 使用方法
PrintVisualTree(this); // 从窗口开始打印

2. 性能分析工具

 
  


    
        
        
            
                
            
            
            
            True
        
    

十、综合应用示例

1. 任务管理器示例

 
  


    
        
        
    
    
    
    
        
            
                
                    
                    
                    
                
            
        
    
    
    
    
        
            
                
                    
                    
                
                
                
                
            
        
        
            
            
        
    
 
  
// ViewModel实现
public class TaskManagerViewModel : ViewModelBase
{
    private ObservableCollection _processes = new ObservableCollection();
    public ObservableCollection Processes => _processes;
    
    private ProcessInfo _selectedProcess;
    public ProcessInfo SelectedProcess
    {
        get => _selectedProcess;
        set => SetField(ref _selectedProcess, value);
    }
    
    private double _cpuUsage;
    public double CpuUsage
    {
        get => _cpuUsage;
        set => SetField(ref _cpuUsage, value);
    }
    
    public TaskManagerViewModel()
    {
        // 启动后台更新
        Task.Run(() => UpdateProcessesAsync());
        Task.Run(() => UpdateCpuUsageAsync());
    }
    
    private async Task UpdateProcessesAsync()
    {
        while (true)
        {
            var processes = await System.Diagnostics.Process.GetProcessesAsync();
            // 转换为ProcessInfo对象并更新集合
            await Application.Current.Dispatcher.InvokeAsync(() => 
            {
                Processes.Clear();
                foreach (var p in processes)
                {
                    Processes.Add(new ProcessInfo(p));
                }
            });
            
            await Task.Delay(1000);
        }
    }
    
    private async Task UpdateCpuUsageAsync()
    {
        // CPU使用率计算逻辑...
    }
}

2. 图表控件实现

 
  


    
        
    


// 代码后端
public partial class CustomChart : UserControl
{
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(ObservableCollection), 
            typeof(CustomChart), new PropertyMetadata(null, OnDataChanged));
    
    public ObservableCollection Data
    {
        get => (ObservableCollection)GetValue(DataProperty);
        set => SetValue(DataProperty, value);
    }
    
    public CustomChart()
    {
        InitializeComponent();
        DataContext = this;
    }
    
    private static void OnDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is CustomChart chart)
        {
            chart.UpdateChart();
        }
    }
    
    private void UpdateChart()
    {
        ChartCanvas.Children.Clear();
        
        if (Data == null || !Data.Any()) return;
        
        var max = Data.Max(d => d.Value);
        var width = ChartCanvas.ActualWidth / Math.Max(1, Data.Count);
        
        for (int i = 0; i < Data.Count; i++)
        {
            var point = Data[i];
            var height = (point.Value / max) * ChartCanvas.ActualHeight;
            
            var rect = new Rectangle
            {
                Width = width - 1,
                Height = height,
                Fill = point.Color,
                Margin = new Thickness(i * width, ChartCanvas.ActualHeight - height, 0, 0)
            };
            
            ChartCanvas.Children.Add(rect);
        }
    }
}

// 数据点类
public class ChartDataPoint
{
    public double Value { get; set; }
    public Color Color { get; set; }
    
    public ChartDataPoint(double value, Color color)
    {
        Value = value;
        Color = color;
    }
}

十一、部署与打包

1. ClickOnce部署

 
  


  
    \\Server\Deploy\
    http://server/deploy/
    1.0.0.0
    1.0.0.0
    true
    Foreground
    7
    Days
  

2. MSI打包

 
  
# 使用WiX工具创建MSI安装包
# 1. 安装WiX工具集
# 2. 创建.wxs项目文件
# 3. 定义产品特性

  
  
  
  
  
  
    
  



  
    
  

十二、未来扩展方向

1. 跨平台支持

 
  
// 使用Avalonia实现跨平台UI
public class CrossPlatformWindow : Window
{
    public CrossPlatformWindow()
    {
        // 平台特定初始化
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            // Windows特定设置
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            // Linux特定设置
        }
    }
}

2. 云集成

 
  
// 集成Azure服务
public class CloudService
{
    private readonly HttpClient _client = new HttpClient();
    
    public async Task UploadFileAsync(string filePath)
    {
        var content = new MultipartFormDataContent();
        var fileContent = new ByteArrayContent(File.ReadAllBytes(filePath));
        content.Add(fileContent, "file", Path.GetFileName(filePath));
        
        var response = await _client.PostAsync("https://yourapp.azurewebsites.net/api/upload", content);
        response.EnsureSuccessStatusCode();
    }
}

3. AI集成

 
  
// 集成ML.NET进行数据分析
public class DataAnalyzer
{
    private readonly PredictionEngine _predictionEngine;
    
    public DataAnalyzer()
    {
        var mlContext = new MLContext();
        var pipeline = mlContext.Transforms.Concatenate("Features", "Feature1", "Feature2")
            .Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression());
        
        var model = pipeline.Fit(mlContext.Data.LoadFromTextFile("data.csv", hasHeader: true));
        _predictionEngine = mlContext.Model.CreatePredictionEngine(model);
    }
    
    public bool Analyze(InputData data) => _predictionEngine.Predict(data).PredictedLabel;
}

通过以上高级技术和示例代码,您可以构建功能丰富、性能优越的WPF应用程序,并为未来的扩展和维护打下坚实的基础。

你可能感兴趣的:(WPF,wpf,c#,WPF高级)