在 ViewModel 中获取窗口属性

2023-12-20

我正在构建一个 WPF 应用程序,其中需要从视图模型获取窗口的宽度、高度和位置。我正在使用以下 XAML:

<Window x:Class="ScreenCapture.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"
        mc:Ignorable="d"
        Height="{Binding Height, Mode=OneWayToSource, FallbackValue=300}"
        Width="{Binding Width, Mode=OneWayToSource, FallbackValue=300}"
        Title="MVVM Light Application"
        Top="{Binding Top, Mode=OneWayToSource}"
        Left="{Binding Left, Mode=OneWayToSource}"
        DataContext="{Binding Main, Source={StaticResource Locator}}">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

    <Grid x:Name="LayoutRoot">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="13*" />
            <ColumnDefinition Width="265*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="25" />
        </Grid.RowDefinitions>
        <TextBlock FontSize="36"
                   FontWeight="Bold"
                   Foreground="Purple"
                   Text="{Binding Welcome}"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Center"
                   TextWrapping="Wrap" Grid.Column="1" Margin="19,70,32,70" />
        <Button Grid.Row="1" Content="Capture" Grid.ColumnSpan="2" Command="{Binding Capture}" />
    </Grid>
</Window>

在我的视图模型中,Top、Left 的值工作正常,但是 Width 和 Height 属性均为 NaN。对于我绑定的每个属性,我都有这样的属性:

private double height;

public double Height
{
    set
    {
        height = value;
    }
}

知道为什么这些值会返回 NaN 吗?更重要的是,我可以做什么来获得我正在寻找的价值观?

EDIT:我意识到这有点不对劲,但我需要从视图模型捕获应用程序的屏幕截图。视图模型包含我没有粘贴的其他属性,但它们是实现所需功能所必需的。出于好奇,以下是我捕获屏幕的方法:

private void CaptureScreen()
{
    int x = Convert.ToInt32(left);
    int y = Convert.ToInt32(top);
    int w = Convert.ToInt32(width);
    int h = Convert.ToInt32(height);
    Bitmap image = new Bitmap(w, h);
    Graphics graphics = Graphics.FromImage(image);

    graphics.CopyFromScreen(x, y, x, y, new Size(w, h), CopyPixelOperation.SourceCopy);

    // Do something with the image
}

As mzabsky说,你需要使用ActualWidth and ActualHeight。这里的问题是它们是只读的,你不能做OneWayToSource Binding在只读依赖属性上。

不过,也有解决方法。
请参阅以下问题:将只读 GUI 属性推回 ViewModel https://stackoverflow.com/questions/1083224/pushing-read-only-gui-properties-back-into-viewmodel

提供的附加行为肯特·布加特让你这样做

<Window ...
        SizeObserver.Observe="True"
        SizeObserver.ObservedWidth="{Binding Width, Mode=OneWayToSource}"
        SizeObserver.ObservedHeight="{Binding Height, Mode=OneWayToSource}">

或者你可以尝试我为此提出的解决方案PushBinding它可用于将只读 DP 推送到视图模型。在你的情况下,用法将如下所示

<Window ...>
    <pb:PushBindingManager.PushBindings> 
        <pb:PushBinding TargetProperty="ActualHeight" Path="Height"/> 
        <pb:PushBinding TargetProperty="ActualWidth" Path="Width"/>
    </pb:PushBindingManager.PushBindings> 
</Window> 

您可以使用下载演示项目PushBinding如果您有兴趣,请在这里:https://www.dropbox.com/s/eqkmsp0q7hb568z/PushBindingInStyleDemo.zip?dl=0 https://www.dropbox.com/s/eqkmsp0q7hb568z/PushBindingInStyleDemo.zip?dl=0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ViewModel 中获取窗口属性 的相关文章

  • MVVM模式下向UIViewController传递数据

    我正在为我的视图控制器使用 MVVM 但我遇到了一个问题 我不确定解决它的最佳方法是什么 基本上 视图控制器 A 显示一个表视图 其中填充了视图模型 A 中的数据 每个单元格都有自己的视图模型 视图模型 A 负责创建这些视图模型并将它们公开
  • 尝试在 Expression-Blend 4 中打开在 Visual Studio 2010 中创建的 WPF 项目时出现问题

    我在 VS 2010 中创建 WPF 项目 在完成功能性 GUI 的工作后 我想在 Blend 4 中编辑控件模板 但是当我在 Blend 中以 DesignMode 打开项目时 他告诉我 无效的 XAML 在结果窗口中他写道 Window
  • wpf 控件宽度绑定

    我有两个带有内容的边框 第二个边框宽度根据情况而变化 在内容上 我试图将第一个边框绑定到第二个边框宽度 但是 它不起作用 我不确定我错过了什么 有人可以给我一些指导吗 下面是我目前正在尝试的示例
  • WPF - 是否必须处置 HwndSource?

    我在用着HwndSource在非主窗口的 WPF 窗口中 为了挂钩窗口过程 WndProc 来接收一些消息 WinSource HwndSource FromHwnd new WindowInteropHelper this Handle
  • 绑定Xaml位图图像

    我有位图图像变量 我想将其绑定到我的 xaml 窗口 System Reflection Assembly thisExe thisExe System Reflection Assembly GetExecutingAssembly st
  • WPF DataGrid 显示点而不是逗号

    在网上查找并寻找答案后没有结果 我想向您寻求帮助 我有一个包含 2 列的 SQL 数据库表 浮点数据类型 例如 1 2 1 3 1 4 等 绑定到一个DataGrid XAML 代码
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • 如何从 WPF 应用程序访问 Windows 文件预览图标

    我在一个目录中有一堆图片和视频 需要在WPF应用程序中显示 我正在考虑将Win7大图标本身显示为预览图像 因为这将节省我从视频文件中抓取适当帧的工作 因为 Windows 已经很好地完成了这项工作 有任何代码片段可以访问此 Shell 图标
  • 如何使 WPF 中的窗口对鼠标事件不可见?

    我创建了这个类 它非常适合使我的 WPF 应用程序对鼠标事件透明 using System Runtime InteropServices class Win32 public const int WS EX TRANSPARENT 0x0
  • 如何计算 WPF 中的非客户端窗口大小?

    WPF 有SystemParameters class http msdn microsoft com en us library system windows systemparameters aspx公开了大量的系统指标 在我的计算机上
  • 在WPF中如何添加菜单项事件?

    在我的 WPF 应用程序中 我添加一个菜单 然后在其下添加几个菜单项 例如 我的菜单项之一是 Main Item 然后我在 Main Item 下添加subItem1 subItem2和subItem3 我想单击 subItem1 并执行某
  • 用什么? MVC、MVP 或 MVVM 还是……?

    我将启动一个 Java 项目来开发桌面应用程序 使用什么作为表示层模式 MVC MVP MVVM 或 如果可能的话 举一些可行的小例子 Actually the ultimate post you re looking for is thi
  • 无法在 WPF 中使用 MVVM 在设计时进行数据绑定 - ViewModel 属性永远不会被调用

    好吧 我正在为此烦恼 所以任何帮助将不胜感激 我正在使用 MVVM 模式构建 WPF 应用程序 为了在设计时获取数据 我将 Ninject 依赖注入框架与服务定位器结合使用 很像文章中的示例 http jonas follesoe no Y
  • MVVM ViewModel 很多属性

    我是 MVVM 新手 正在开发一个应用程序 我有一个包含很多属性的表单视图 大约 50 个 我不能将它们分离到用户控件中 因为这会破坏 mvvm 原则 我无法将它们分成模型 因为它们包含逻辑 属性更改 错误更改这些都不是 poco 类 并且
  • 如何在 XAML 中使用其他项目的图像?

    我正在构建一个包含多个项目的解决方案 Windows Phone 应用程序 其中一个项目是用于 品牌 的 它包含一些特定的代码和图像 其想法是该项目可以更换为不同的品牌 我的应用程序页面位于主项目中 我想在主应用程序的 UI 中显示存储在第
  • WPF C# 输入框

    我正在使用 C 构建 WPF 应用程序 我想弹出一个对话框提示用户输入他 她的名字 之后 我将跟踪该名称并将一些数据保存到 txt使用该名称的文件 例如 输入的名称是姓名 约翰 所以我有数据数据 1 2 3 然后我将 数据 保存在John
  • WPF DataGrid 排序后滚动到顶部

    我有一个使用数据网格的 Net 4 0 WPF 应用程序 目前 按列排序后 网格的滚动位置保持在排序前的位置 对于此应用程序 我需要在任何排序后滚动到网格顶部 我尝试过像这样处理排序事件 Private Sub myDataGrid Sor
  • MVVM 创建 ViewModel

    有人可以向我解释一下如何为 MVVM 模式创建 ViewModel 我试图理解这里的教程 http msdn microsoft com en us magazine dd419663 aspx http msdn microsoft co
  • 是否可以仅突出显示图像的某些部分(不透明度)?

    我已对图像应用了不透明度 这是代码
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person

随机推荐

  • 更改 ggplot 中的线宽,而不是大小

    我看到几篇关于改变线宽 https stackoverflow com questions 14794599 how to change line width in ggplot在 ggplot 中 这些答案虽然对OP来说内容丰富且有效 但
  • 使用引用字段值进行聚合中的 Mongodb 正则表达式

    注意 我使用的是 Mongodb 4 我必须使用聚合 因为这是更大聚合的一步 Problem 如何在集合文档中查找包含以同一文档中另一个字段的值开头的字段 让我们从这个集合开始 db regextest insert first Pizza
  • VBA Excel 中的弹出图表

    我想知道是否有一种方法可以根据特定工作表中找到的值 通过按按钮在 Excel 中创建弹出图表 最好的方法是能够在 VBA 中完成它 我一直在研究但找不到任何真正的解决方案 有什么建议么 你 你这个幸运儿 p 由于我有空 我为您创建了一个基本
  • 字符串文字:它们去了哪里?

    我对字符串文字的分配 存储位置感兴趣 我确实找到了一个有趣的答案here https stackoverflow com questions 51592 is there a need to destroy char string or c
  • 自托管 Azure DevOps Agents 卷映射

    在执行容器化任务时 在 K8s 中运行自托管 docker 构建代理时 出现以下错误 我已按照文档进行操作here https learn microsoft com en us azure devops pipelines agents
  • UILabel 优于 UIProgressView,具有多种颜色

    所以我还没有这样做 我正在尝试弄清楚如何做到这一点 所以我制作了一个 UITableView 每个单元格都有一个关联的 NSTimer 现在 在每个自定义 UITableViewCell 中 我都有一个 UIProgressView 作为背
  • 一旦这些容器执行的脚本调用 exit() ,如何退出“docker run”容器

    我有一个 docker compose 设置 分三步部署 构建所有容器并dc up d dc是一个别名docker compose 创建数据库 dc run web usr local bin python create db py 使用以
  • while(i--) s+= a[i]; 是吗?包含 C 和 C++ 中未定义的行为?

    考虑简单的代码 include stdio h define N 10U int main int a N 0 unsigned int i N int s 0 Fill a while i s a i printf Sum is d n
  • 从哪里可以更改 App Store 中已有应用程序的刷新率?

    我在 iPhone 和 Android 应用商店中有一个应用程序 他们有横幅广告和插页式广告 我记得设置刷新率时设置过一次 但现在找不到了 我检查了我的管理员帐户 但找不到可以更改的位置 在 AdMob 网站中的哪里可以找到此设置 登录Ad
  • 堆栈服务容器动态主机名

    我正在从 Docker Cloud 迁移到纯 Docker Swarm 设置 我缺少的一件事是容器如何将主机名设置为 SERVICE NAME SLOT NUMBER 是否可以在 Swarm 堆栈服务中动态设置主机名 容器名称 在您的堆栈
  • 使用 HTML5 CSS3 强制 iframe YouTube 视频居中并在后台完全覆盖屏幕

    如何强制使用 HTML5iframeYouTube视频居中适配 覆盖全屏窗口背景使用CSS3 HTML最终Java 比如说 贝宝 it http paypal it 主页背景或 unity3d com 5 http unity3d com
  • 更改表 ASP.NET 中复选框列表的 css 样式

    我想将 asp net 中复选框的 css 样式更改为与 w3school 上的样式相同的样式https www w3schools com howto tryit asp filename tryhow css custom checkb
  • 使用 Jackson,使用排序键序列化 JSON

    我正在尝试用 Jackson 替换 groovy grails 项目中的自定义 JSON 反 序列化 我无法让 Jackson 输出一个打印精美的 JSON 其中的键按简单的 自然 字母顺序排序 我已经尝试过这个 以及许多变体 mymap
  • Emacs 24 中变量作用域的新规则是什么?

    Emacs 24 现在具有词法范围的变量 当然 它仍然具有动态范围的变量 现在它兼具了两者 我对变量何时具有哪种作用域感到非常困惑 有一个lexical binding控制何时启用词法绑定的变量 我想我读过一些关于defvar现在声明一个动
  • 是什么让钥匙串项目独一无二(在 iOS 中)?

    我的问题涉及 iOS iPhone iPad 中的钥匙串 我认为 但不确定 Mac OS X 下钥匙串的实现提出了相同的问题和相同的答案 iOS 提供五种类型 类别 的钥匙串项目 您必须为键选择这五个值之一kSecClass确定类型 kSe
  • 编辑用户详细信息会创建新用户。设计,Rails 4

    我有一个奇怪的问题 以前创建的表单而不是更新用户详细信息 例如电子邮件或姓名 而是使用给定的详细信息创建新用户 My form 我取自这个代码示例视图 设计 注册 编辑 div class form group div
  • 将计数添加到图例标签

    我正在尝试将计数 百分比添加到饼图的图例标签中 我知道饼图很糟糕 但这不是本文的重点 我想将 Count 的值粘贴到图例上的 Wound Type 标签 但无法弄清楚如何访问以下代码的每次迭代的计数 目标将类似于 裂痕 5 或任何计数 我尝
  • 检查字符串是否不包含另一个字符串

    在 T SQL 中 如何检查一个字符串是否不包含另一个字符串 我有一个nvarchar这可能是 橙子苹果 我想做一个更新 例如 一个列doesn t包含 苹果 如何才能做到这一点 WHERE NOT someColumn LIKE Appl
  • Xcode 自动完成建议 NSArray getter 神秘的“songsAtIndexes”

    我的类中有一个名为 歌曲 的 NSArray 类型的属性 我正在为其创建一个自定义 getter XCode 为我提供了创建方法的选项 songsAtIndexes NSIndexSet indexes 这是什么 为什么 XCode 提供这
  • 在 ViewModel 中获取窗口属性

    我正在构建一个 WPF 应用程序 其中需要从视图模型获取窗口的宽度 高度和位置 我正在使用以下 XAML