可扩展应用程序标记语言(XAML)是一种基于XML的声明式语言,用于在各种框架中初始化结构化值和对象。当问题是关于具有特定框架的XAML的使用时,还应该提供框架的标签,例如, [wpf](Windows Presentation Foundation),[silverlight],[windows-phone],[windows-store-apps](Windows 8商店应用),[win-universal-app],[xamarin.forms]或[工作流程 - 基础]
为什么 `<StaticResource ResourceKey="{x:Static ... }" />` 在 DataTemplate 中不起作用?
我在 WPF 中遇到了一个奇怪的边缘情况,即允许嵌套元素与属性。我有一个基本的 WPF 应用程序、一个窗口和一个默认的 App.xaml。
无法将本地 html 文件加载到 .NET MAUI WebView 中
我有一个基本网页,我正在尝试将其加载到 XAML 页面上的 WebView 中。相关代码是这样的: 我有一个基本网页,我正在尝试将其加载到 XAML 页面上的 WebView 中。相关代码是这样的: <WebView x:Name="WebViewQuestionText" Source="editor.html" HeightRequest="500" WidthRequest="500" /> 根据官方 Microsoft .NET MAUI 文档,我将 editor.html 位于 /Resources/Raw/editor.html 中,并将其设置为 MauiAsset 的构建操作。 在运行时我不会生成任何错误,但 WebView 是空白的。对 WebView 的检查显示一个网页是准系统,其中没有任何内容,我认为这是 WebView 控件的默认设置。如果我输入实际的 URL,页面就会加载并按预期工作,显示给定网站的内容。 我相信它只是找不到我的页面来显示它。我目前正在为 Windows 构建,但该应用程序最终将部署到 Windows 和 Mac。我怎样才能确保它正确找到它? 正如下面指出的 - 我也尝试过这种方式,得到相同的结果 - 当我单击链接时,我得到一个空白页面。 <WebView x:Name="WebViewQuestionText" HeightRequest="500" WidthRequest="500"> <WebView.Source> <HtmlWebViewSource> <HtmlWebViewSource.Html> <![CDATA[ <html> <head> </head> <body> <h1>.NET MAUI</h1> <p>The CSS and image are loaded from local files!</p> <p><a href="editor.html">next page</a></p> </body> </html> ]]> </HtmlWebViewSource.Html> </HtmlWebViewSource> </WebView.Source> </WebView> 我的editor.html页面如下: <!DOCTYPE html> <HTML> <BODY> <H1>This is a test</H1> <P>This is only a test</P> </BODY> </HTML> 我已经用 this PR 修复了这个问题到 .Net Maui 中。将在未来几周内发布 SR2 版本。 文档表明它在所有平台上都一致工作,但它根本从未在 Windows 上实现过......有点令人担忧。 我在 PR 上发布的解决方法(下面 Reinaldo 也提到过)将同时解决这个问题,但是一旦 SR2 发布并更新到它,您可能应该将其删除。 这最终成为 Windows 平台上针对 .NET MAUI 的当前未解决的错误。 https://github.com/dotnet/maui/issues/5523 似乎有一个解决方法here,但并不理想。该问题似乎是解决 Windows 上本地文件的正确路径问题之一,因此解决方案是直接通过 StreamReader 加载文件 如前所述,目前这是一个未解决的错误。然而,除了使用 StreamReader 之外,还有一种解决方法。 #if WINDOWS private static readonly System.Lazy<bool> _isPackagedAppLazy = new System.Lazy<bool>(() => { try { if (Windows.ApplicationModel.Package.Current != null) return true; } catch { // no-op } return false; }); private static bool IsPackagedApp => _isPackagedAppLazy.Value; // Allow for packaged/unpackaged app support string ApplicationPath => IsPackagedApp ? Windows.ApplicationModel.Package.Current.InstalledLocation.Path : System.AppContext.BaseDirectory; #endif private async void WebView_HandlerChanged(object sender, EventArgs e) { #if WINDOWS await ((sender as WebView).Handler.PlatformView as Microsoft.Maui.Platform.MauiWebView).EnsureCoreWebView2Async(); ((sender as WebView).Handler.PlatformView as Microsoft.Maui.Platform.MauiWebView).CoreWebView2.SetVirtualHostNameToFolderMapping( "localhost", ApplicationPath, Microsoft.Web.WebView2.Core.CoreWebView2HostResourceAccessKind.Allow); var wv = (sender as WebView).Handler.PlatformView as Microsoft.Maui.Platform.MauiWebView; wv.LoadUrl($"https://localhost/{wv.Source.AbsolutePath}"); #endif } WebView 看起来像这样: <WebView x:Name="dashBoardWebView" BackgroundColor="Transparent" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" IsVisible="True" HandlerChanged="WebView_HandlerChanged" Source="test.html"></WebView> 希望有帮助。 注意:取自https://github.com/dotnet/maui/pull/7672 对于那些在 2022 年(SR2 发布之前)看到这篇文章的人(请参阅 Breeno 的回答);这是来自我最近开始使用的一个工作应用程序 - 您可以直接加载本地页面,而必须执行<HtmlWebViewSource>的事情: <WebView x:Name="webViewWiki" Source="/WikiContent/index.html" /> 其中 WikiContent 位于解决方案结构中的 /Resources/Raw 文件夹中,即: HTML 中页面、图像和样式表的相对链接将按预期工作: <html> <head> <title>Test Index</title> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <h1>Index</h1> <h2>Vessel</h2> <ul> <li><a href="bgChartplotterGuide.html">Chart Plotter Guide</a></li> </ul> <h2>Physics</h2> <ul> <li><a href="physics_wind_in_sails.html">Physics: Wind in Sails Chart</a></li> <li><a href="anchoring.html">Anchoring</a></li> <li><a href="depth.html">Depth</a></li> </ul> </body> </html> 顺便说一下: 文档表明它在所有平台上都能一致工作,但它 只是从未在 Windows 上实现过...有点令人担忧。 哈哈,只是一点点!
UWP - DatePicker 和 TimePicker 自定义
我想在同一行(水平)使用 DatePicker 和 TimePicker。我的问题是这些控件太宽了。所以我定制了它们以减少内容,但我无法减少宽度,因为......
示例我得到了这一行: 注意参数如何无序 示例我得到了这一行: 注意参数如何无序 <Button HorizontalAlignment="Center" Margin="200,150,0,0" Width="189" Content="Boo" Style="{DynamicResource btnGrayDownWIthcon}" IsDefault="True" IsCancel="False" Background="{DynamicResource ContractApprovedGreen}" Height="53" VerticalAlignment="Center" Name ="btnPoo" /> 一片混乱 我希望是这样: <Button Name ="btnPoo" Content="Boo" Background="{DynamicResource ContractApprovedGreen}" Style="{DynamicResource btnGrayDownWIthcon}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="200,150,0,0" Width="189" Height="53" IsDefault="True" IsCancel="False" /> 是否有任何自动工具可以按优先级和组对xaml参数重新排序? 是的,有一个名为 XAML Markup Styler 的 Visual Studio 扩展,您可以从 https://github.com/Xavalon/XamlStyler 免费下载和使用它。我和我的团队已经使用它几个月了,效果很好。它也可以对组/优先级进行重新排序。 :)
我尝试使用 .NET MAUI 在 Visual Studio 中制作一个简单的应用程序。我搜索了添加文本并更改其属性的最简单方法,并且发现了文本框和文本块,但是当我想要...
如何使用EntityFrameworkCore的实体配置属性绑定?
当我绑定 AnotherEntity 的名称时,我的 WPF (netcore3.1-windows) EFCore 5 应用程序中没有初始数据。 数据最初加载在同一个应用程序中,但使用 WPF (net40) EFCore 6 应用程序...
如何配置GridViewColumn到List的属性绑定<EntityFrameworkCore's Entity>?
当我绑定 AnotherEntity 的名称时,我的 WPF (netcore3.1-windows) EFCore 5 应用程序中没有初始数据。 数据最初加载在同一个应用程序中,但使用 WPF (net40) EFCore 6 应用程序...
创建一个从 C# 中的 WPF 控件派生的自定义 <Page> 类?
我之前一直在我的WPF应用程序中使用System.Windows.Controls.Page类。 现在需要创建我自己的类“CustomPage”,派生自“System.Windows.Controls.Page&...
.NET MAUI 应用程序解决方案:错误(活动)APT2000 预期引用但得到(原始字符串)#000000
我在构建 .NET MAUI 应用程序解决方案时遇到问题。 当我构建解决方案时(在 Visual Studio 中),我收到以下错误消息: res/values/values.xml(6):错误 APT2000:预期引用...
我想创建一个宽度为800的Flyout,与TextBox相同。然后将弹出控件附加到文本框。由于我无法直接设置 Flyout 的宽度(没有...
我想创建一个宽度为800的Flyout,与TextBox相同。然后将弹出控件附加到文本框。由于我无法直接设置 Flyout 的宽度(没有...
我在 App.xaml 中定义了以下样式 <Setter Property="VerticalScrollBarVisibility" Value="Auto" /> ...</desc> <question vote="13"> <p>我在 App.xaml 中定义了以下样式</p> <pre><code><Style x:Key="textBoxMultiline" TargetType="{x:Type TextBox}" > <Setter Property="VerticalScrollBarVisibility" Value="Auto" /> <Setter Property="HorizontalScrollBarVisibility" Value="Hidden" /> <Setter Property="MinHeight" Value="50" /> <Setter Property="TextWrapping" Value="Wrap" /> </Style> </code></pre> <p>在整个解决方案中,我们在每个需要简短文本的文本框上使用它。</p> <pre><code><TextBox x:Name="textBoxDescription" Grid.Row="2" Grid.Column="1" Style="{DynamicResource textBoxMultiline}" /> </code></pre> <p>一切都很好,但随后客户抱怨某些字段被合并在分辨率较低的旧显示器上,因此我在较高的视觉树节点之一上放置了<pre><code>ScrollViewer</code></pre>以防止合并。</p> <pre><code><ScrollViewer Height="Auto" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> ... </ScrollViewer> </code></pre> <p>奇怪的是,具有上述样式的 <pre><code>TextBox</code></pre> 开始向右扩展,而不是环绕文本。</p> <p>有没有办法在不删除<pre><code>ScrollViewer</code></pre>的情况下防止这种情况? </p> </question> <answer tick="false" vote="11"> <p>如果您不想对宽度进行硬编码,那么您可以使用元素绑定父项的宽度。</p> <p>这里我将 TextBox MaxWidth 与 ScrollViewer 实际宽度绑定。您还必须确保 ColumnDefinition 宽度应设置为“*”而不是“Auto”。如果将其设置为“自动”,它将忽略 ScrollViewer 宽度并继续扩展 ScrollViewer 和 TextBox 的宽度。 <em><strong>我认为你属于这种情况</strong></em>...</p> <pre><code><Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> </Grid.ColumnDefinitions> <ScrollViewer HorizontalScrollBarVisibility="Auto" Name="scv"> <TextBox Height="30" TextWrapping="Wrap" MaxWidth="{Binding ElementName=scv, Path=ActualWidth}"></TextBox> </ScrollViewer> </Grid> </code></pre> </answer> <answer tick="true" vote="9"> <p>您必须为<pre><code>MaxWidth</code></pre>定义一个<pre><code>TextBox</code></pre>,否则没有限制,因为<pre><code>ScrollViewer</code></pre>。</p> </answer> <answer tick="false" vote="6"> <p>@bathineni 提供的解决方案帮助我解决了我的问题。这对我有用:</p> <pre><code><Grid > <Grid.ColumnDefinitions> <ColumnDefinition Width="50"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Button Grid.Column="0" Width="30" Height="23" Margin="10,5" Content="..."/> <ScrollViewer Grid.Column="1" HorizontalScrollBarVisibility="Disabled" verticalScrollBarVisibility="Disabled" Name="scv"> <TextBox Height="25" Text="Insert here long text" MaxWidth="{Binding ElementName=scv, Path=ActualWidth}" HorizontalAlignment="Stretch" /> </ScrollViewer> </Grid> </code></pre> </answer> <answer tick="false" vote="1"> <p>第一个解决方案是使用数据绑定在 XAML 中实现的。我建议你不要单独绑定控件。 XAML 解决方案是通过将具有所需 ActualWidth 和 ActualHeight 属性的控件绑定到文本框 MaxHeight 和 MaxWidth 属性来实现的。</p> <pre><code><TextBlock x:Name="PasswordText" Margin="0,0,0,20" FontFamily="Bahnschrift SemiBold Condensed" Text="PASSWORD" FontSize="20"> <TextBox x:Name="PasswordTextBox" MaxWidth="{Binding ElementName=PasswordText, Path=ActualWidth}" MaxHeight="{Binding ElementName=PasswordText, Path=ActualHeight}"> </code></pre> <p>下一个解决方案是通过在 XAML 中生成 Loaded 事件,在 C# 代码中创建它,然后在 Loaded 事件中将文本框的 MaxWidth 和 MaxHeight 属性设置为文本框 ActualWidth 和 ActualHeight 属性来实现。</p> <pre><code>// It doesn't have a problem like in XAML if you pass the textbox its own // ActualWidth and ActualHeight to the MaxWidth and MaxHeight proprieties. private void Log_In_Page_Loaded(object sender, RoutedEventArgs e) { UsernameTextBox.MaxHeight = UsernameTextBox.ActualHeight; UsernameTextBox.MaxWidth = UsernameTextBox.ActualWidth; } </code></pre> <p>选择更适合你设计的一个,但我认为,在我看来,这是解决这个问题最有效、最简单、最稳定、最有效的方法。</p> </answer> <answer tick="false" vote="0"> <p>对我有用。如果你想让滚动条出现在文本框中,你可以添加</p> <pre><code>HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" </code></pre> <p>到文本框 </p> </answer> <answer tick="false" vote="0"> <p>您必须设置 <pre><code>MaxWidth</code></pre><pre> 的 </pre><code>Container Control</code></p> <pre><code><Grid x:Name="RootGrid" Margin="6,6,8,8" Width="500" MaxWidth="500"> <ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <GroupBox Name="contentGroup" Header="Content" Grid.Row="0"> <TextBox Name="content"/> </GroupBox> </Grid> </ScrollViewer> </code></pre> <p></p> </answer> <answer tick="false" vote="0"> <p>当我需要我的<pre><code>TextBox</code></pre>在调整大小时与其自动调整大小的<pre><code>Grid</code></pre>列一起拉伸时,我遇到了这个问题,这意味着<pre><code>MaxWidth</code></pre>不起作用,但仍然需要防止<pre><code>TextBox</code></pre>拉伸及其内容。</p> <p>我最终所做的是将这个事件处理程序链接到<pre><code>SizeChanged</code></pre>:</p> <pre><code>private void TextBox_SizeChanged(object sender, SizeChangedEventArgs e) { TextBox textBox = (TextBox)sender; if (textBox.CanUndo && e.NewSize.Width > e.PreviousSize.Width) { textBox.Width = e.PreviousSize.Width; } } </code></pre> <p>将文本写入文本框是用户可以撤消的操作,而其他可能导致调整大小的操作(元素的初始绘制、父容器的拉伸等)则无法从文本框中撤消。因此,通过检查 <pre><code>CanUndo</code></pre>,我们可以确定 <pre><code>SizeChanged</code></pre> 是否是由写入文本或其他内容触发的。</p> <p><pre><code>e.NewSize.Width > e.PreviousSize.Width</code></pre> 检查是必要的,因为没有它,<pre><code>SizeChanged</code></pre> 事件将从自身内部无限地调用,因为要恢复拉伸,我们需要 <em>将大小</em> 更改回原始值,这本身就会触发事件。</p> <p>这有点棘手,但我还没有遇到任何问题。</p> </answer> <answer tick="false" vote="0"> <p>我不知道为什么,但我无法让 ScrollViewer 解决方案工作。我需要一个具有固定初始宽度的 TextBox 来实现数字向上/向下控件 - 在此控件中,TextBox 独立于输入而缩小和增长,如果 UI 在您键入时发生变化,这看起来非常烦人。</p> <p>所以,我发现以下使用 2 个文本框的解决方案适合我。第一个文本框是为用户键入输入而显示的文本框,第二个文本框通过依赖属性 (DisplayLength) 和下面进一步显示的转换器进行初始化。</p> <p>将第一个文本框的 MaxWidth 属性绑定到第二个文本框的 Width 属性可以固定大小,以便用户可以键入他们想要的内容,但即使有更多可用的 UI 空间,文本框的显示宽度也不会改变。</p> <pre><code><TextBox x:Name="PART_TextBox" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}" Margin="0,0,1,0" TextAlignment="Right" AcceptsReturn="False" SpellCheck.IsEnabled="False" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Center" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MaxWidth="{Binding ElementName=TBMeasure, Path=ActualWidth}" /> <!-- Hidden measuring textbox ensures reservation of enough UI space according to DisplayLength dependency property --> <TextBox x:Name="TBMeasure" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisplayLength, Converter={StaticResource ByteToPlaceHolderStringConverter}}" Margin="0,0,1,0" TextAlignment="Right" AcceptsReturn="False" SpellCheck.IsEnabled="False" HorizontalContentAlignment="Right" VerticalContentAlignment="Center" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Visibility="Hidden"/> // Converter [ValueConversion(typeof(byte), typeof(string))] public sealed class ByteToPlaceHolderStringConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if ((value is byte) == false) return Binding.DoNothing; byte byteVal = (byte)value; string retString = string.Empty; for (int i = 0; i < byteVal; i++) retString = retString + "X"; return retString; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return Binding.DoNothing; } } </code></pre> </answer> </body></html>
当 Android 12 及更高版本时,启动画面在 .net maui 中不显示全屏
当 Android 12 及更高版本时,启动屏幕在 .NET Maui 中不显示全屏。启动画面像往常一样包含一个徽标和底部的几行文字。问题是图像和...
XAML 绑定到 ViewModel 上的 CollectionViewSource 属性
我有一个简单的 ViewModel,例如: 公共类MainViewModel { ObservableCollection _projects; 公共 MainViewModel() { // 在这里填写数据库中的_projects...
为什么 WPF UserControl 的宿主窗口不被视为其逻辑父窗口?
我自己遇到这个问题后,正在阅读 Rohit Vats 对这篇文章的回答,并且想知道为什么 UserControl 的“父”窗口不被视为其逻辑父窗口。他...
如何在WPF(XAML)中与数据内容和滚动条在同一行添加重复按钮
我想从我的 Web 应用程序到我的 WPF 桌面应用程序重新创建此设计。 在这个设计中,我在侧面有这些 << and >> 重复按钮。 这是我的 WPF 中的图像
XamlType.GetAliasedProperty 有什么意义
我尝试寻找有关此方法的信息,但我无法理解它的含义和实用性。 MSDN 对此是这么说的:https://msdn.microsoft.com/en-us//library/vs...
MAUI Toaster 在 Windows 应用程序中单击时会创建应用程序的新实例
我正在 Windows 基础应用程序上使用 .NET MAUI 应用程序,我在其中实现了用于通知的 Toast。但是,我遇到了单击 toast 消息(或 Sna...
我有这个简单的网格,这不是我有垂直堆栈布局然后水平堆栈布局的网格。在此,条目不占用 100% 宽度。我做错了什么。 我有这个简单的网格,这不是我有垂直堆栈布局然后水平堆栈布局的网格。在此,条目不占用 100% 宽度。我做错了什么。 <Grid RowDefinitions="Auto,20,20,Auto" Padding="10" ColumnDefinitions="*,*"> <Label Grid.Row="0" Grid.RowSpan="3" Grid.Column="0" Text="8901 PKR" BackgroundColor="Maroon" TextColor="White" VerticalTextAlignment="Center"></Label> <Label Grid.Row="0" Grid.Column="1" Text="5032 PKR" BackgroundColor="Maroon" TextColor="White" VerticalTextAlignment="Center"></Label> <Label Grid.Row="1" Grid.Column="1" Text="5032 PKR" BackgroundColor="Maroon" TextColor="White" VerticalTextAlignment="Center"></Label> <Label Grid.Row="2" Grid.Column="1" Text="5032 PKR" BackgroundColor="Maroon" TextColor="White" VerticalTextAlignment="Center"></Label> <!-- Form layout --> <VerticalStackLayout Grid.Row="3" Grid.ColumnSpan="2"> <!-- Account Type Row --> <HorizontalStackLayout Padding="0,10,0,10" HorizontalOptions="Fill"> <Label Text="Account Type" VerticalTextAlignment="Center" WidthRequest="100"></Label> <Entry Text="Account Type" HorizontalOptions="FillAndExpand"></Entry> </HorizontalStackLayout> <!-- Expense Type Row --> <HorizontalStackLayout HorizontalOptions="Fill"> <Label Text="Expense Type" VerticalTextAlignment="Center" WidthRequest="100"></Label> <Entry Text="Expense Type" HorizontalOptions="FillAndExpand"></Entry> </HorizontalStackLayout> <!-- Amount Row --> <HorizontalStackLayout HorizontalOptions="Fill"> <Label Text="Tota" VerticalTextAlignment="Center" WidthRequest="100"></Label> <Entry Text="" HorizontalOptions="FillAndExpand"></Entry> </HorizontalStackLayout> <!-- Description Row --> <HorizontalStackLayout HorizontalOptions="Fill"> <Label Text="Description" VerticalTextAlignment="Center" WidthRequest="100"></Label> <Entry Text="Descr" HorizontalOptions="FillAndExpand"></Entry> </HorizontalStackLayout> <!-- Submit Button --> <Button Text="Submit" HorizontalOptions="Fill"></Button> </VerticalStackLayout> <ListView> </ListView> </Grid> StackLayout中的组件仅占用其所需的空间。 您可以尝试使用 Grid 来代替。 <!-- Account Type Row --> <Grid Padding="0,10,0,10" ColumnDefinitions="Auto, *"> <Label Grid.Column="0" Text="Account Type" VerticalTextAlignment="Center" WidthRequest="100"></Label> <Entry Grid.Column="1" Text="Account Type"></Entry> </Grid> 附注不要再使用FillAndExpand了。它已被弃用。 Fill 是默认值,因此无需指定。
当鼠标悬停在元素上时调整 ColumnDefinition 的大小
当用户的光标位于 Border 元素上时,我试图使网格列占据大部分窗口。 鼠标位于右侧边框的示例 但是,我无法获取 ColumnDefintion.W...