在 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 中获取窗口属性 的相关文章

  • ItemSource 中具有不同类型数据的 ListView 多行列标题

    继续this https stackoverflow com q 26712051 1997232问题 我想实现这种ListView 它应该有两件事 多行列标题 不同的数据类型通过绑定ItemsSource以不同方式显示 为了解决 1 我尝
  • 窗口关闭后仍在调用方法

    首先我不知道这是不是一个愚蠢的问题 我有这样的场景 首先我有一个主窗口 public MainWindow InitializeComponent dt is a System Windows Threading DispatcherTim
  • 从 xaml 获取 RowIndex

    我有一个带有 DataGridTemplateColumns 的 DataGrid 在 TemplateColumn 中 我使用工作正常的 DataTrigger 它从 DataGrid 父级检索项目计数
  • 视图中的 XamlParseException

    我有一个仅显示标签的视图 视图模型已正确注入视图中 因为标签的文本已绑定到视图模型属性 现在 如果我尝试在 xaml 中定义 DataGrid 则会出现 XamlParseException System Windows Markup Xa
  • Winforms 中的 WPF ElementHost 最大化时崩溃 (Windows)

    我正在尝试将新的 WPF 控件集成到现有的 WinForms 应用程序中 并使用 ElementHost Dock Fill 来托管以下 XAML UserControl NET 4 当我将 WinForm 设置为最大化时 我的整个操作系统
  • ListView ItemContainerStyle 模板

    我创建了用作 ListView 项目模板的样式 其中包含 CheckBox 和 TextBlock
  • 混合 MFC 和 WPF:模态对话框

    我使用 C CLI 界面层将 C WPF 对话框添加到现有的 C MFC 应用程序 我一切正常 只是我遇到了形式问题 例如 MFC 应用程序使用 ShowDialog 显示 WPF 对话框 按预期工作 该 WPF 对话框显示使用 DoMod
  • WPF 绑定 CompositeCollection 中的 MenuItem 不起作用

    我在将命令绑定到复合集合中的菜单项时遇到问题 这MenuItem是其一部分ContextMenu这是定义在UserControl Resources 问题是新标签的绑定不起作用 当我将 MenuItem 放置在复合集合之外时 它将起作用 有
  • ScrollViewer 滚动条始终禁用

    我是 xaml 和 wpf 的新手 我正在尝试将一些用户控件从代码隐藏插入到容器中 我已阅读此博客文章MSDN http blogs msdn com b marcelolr archive 2009 06 09 stackpanel do
  • 如何在 WinRT XAML Toolkit 折线图中设置轴边距?

    Answer 最后我用这个解决了我的答案 LineSeries MyChart Series 0 IndependentAxis new LinearAxis Minimum 1 Maximum 5 Orientation AxisOrie
  • .NET / C# / WPF 项目的命名约定

    NET C WPF 项目广泛接受的命名约定是什么 Microsoft 有一篇关于命名约定的内容广泛的 MSDN 文章here http msdn microsoft com en us library ms229002 aspx
  • 如何枚举控件的所有依赖属性?

    我有一些 WPF 控件 例如 文本框 如何枚举该控件的所有依赖属性 如 XAML 编辑器所做的那样 不需要使用反射 恕我直言 这是一个坏主意 因为框架已经为此提供了实用程序类 但它们并不明显找到 以下是基于这篇文章的答案 枚举绑定 http
  • 如何在 WPF 应用程序上执行异步启动?

    我在异步等待方面相当落后 所以这可能是一个 duh 问题 我正在开发一个非常小的 UI 应用程序 它使用以下命令从系统托盘运行WPF 通知图标 http www codeproject com Articles 36468 WPF Noti
  • WPF:通过拖放重新排序 WrapPanel 内容?

    我正在寻找一种通过拖放对 WPF WrapPanel 的内容 项目 重新排序的方法 我只想单击一个项目并将其拖动到新位置 据我了解 这是一项非常常见的任务 我想知道有人已经这样做了 或者知道如何实现此功能 我已经进行了谷歌搜索 但什么也没找
  • WPF 创建同级窗口并关闭当前窗口

    我需要的是我的窗口类中的这样一个事件处理程序 void someEventHandler object sender RoutedEventArgs e MyNewWindow mnw new MyNewWindow mnw Owner W
  • 使用 ICollectionView 过滤 ObservableCollection

    I have ObservableCollection绑定到dataGrid现在我想过滤我看到需要使用的呈现数据ICollectionView但我不知道如何添加ICollectionView和我的MVVM图案 我的代码简化如下 public
  • 不将 ViewModel 放置在单独的程序集中有充分的理由吗?

    我正在 WPF 中使用 MVVM 模式开发一个项目 MVVM 的主要优势之一是保持业务逻辑和表示之间的清晰分离 为了测试所有内容实际上的分离程度 周末我将所有 ViewModel 模型和业务逻辑移动到一个单独的 dll 中 exe 被保留为
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • WPF:如何避免图像超出 Canvas 的边界?

    我有一个画布作为图像查看器 它的背景用于放置图像 我想在其上面放置另一个图像 所以 场景是这样的
  • 主从视图中聚合详细信息值

    我在一些自定义实体中有主从关系 假设我有以下结构 class Master INotifyPropertyChanged public int Id get set property changed implementation publi

随机推荐

  • 更改 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