WPF pass MainWindow to viewmodel as a shortcut for viewmodel
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var vm = new MainVM(this); this.DataContext = vm; } } public class MainVM : INotifyPropertyChanged { private MainWindow mainWin; public MainVM(MainWindow win) { mainWin = win; if (mainWin != null) { MainVMLoaded(); } } }
//xaml <Window x:Class="WpfApp262.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp262" mc:Ignorable="d" WindowState="Maximized" Title="MainWindow" Height="450" Width="800"> <Grid> <Image x:Name="img" Source="{Binding ImgUrl,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> <Image.RenderTransform> <TransformGroup> <ScaleTransform x:Name="scaler" x:FieldModifier="public"/> </TransformGroup> </Image.RenderTransform> </Image> <Button x:Name="upBtn" Content="Former" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="100" Height="50"/> <Button x:Name="nextBtn" Content="Next" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="100" Height="50"/> </Grid> </Window> //cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; 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.Media.TextFormatting; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp262 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var vm = new MainVM(this); this.DataContext = vm; } } public class MainVM : INotifyPropertyChanged { private MainWindow mainWin; public MainVM(MainWindow win) { mainWin = win; if (mainWin != null) { MainVMLoaded(); } } private void MainVMLoaded() { mainWin.MouseWheel += MainWin_MouseWheel; if (mainWin.upBtn != null) { mainWin.upBtn.Click += UpBtn_Click; } if (mainWin.nextBtn != null) { mainWin.nextBtn.Click += NextBtn_Click; } imgsList = new List<string>(System.IO.Directory.GetFiles(@"../../Images")); if (imgsList != null && imgsList.Any()) { ImgUrl = imgsList[0]; } } private void NextBtn_Click(object sender, RoutedEventArgs e) { if (++imgIdx >= imgsList.Count) { imgIdx = 0; } ImgUrl = imgsList[imgIdx]; } private void UpBtn_Click(object sender, RoutedEventArgs e) { if(--imgIdx<0) { imgIdx = imgsList.Count - 1; } ImgUrl= imgsList[imgIdx]; } private void MainWin_MouseWheel(object sender, MouseWheelEventArgs e) { if (mainWin.scaler != null) { if (e.Delta > 0) { mainWin.scaler.ScaleX *= 1.2; mainWin.scaler.ScaleY *= 1.2; } else { mainWin.scaler.ScaleX /= 1.2; mainWin.scaler.ScaleY /= 1.2; } mainWin.scaler.CenterX = e.GetPosition(mainWin.img).X; mainWin.scaler.CenterY = e.GetPosition(mainWin.img).Y; } } private List<string> imgsList; private int imgIdx = 0; private string imgUrl; public string ImgUrl { get { return imgUrl; } set { if (imgUrl != value) { imgUrl = value; OnPropertyChanged(nameof(ImgUrl)); if(mainWin!=null) { mainWin.Title = ImgUrl; } } } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { var handler = PropertyChanged; if (handler != null) { handler?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!