win-universal-app 相关问题

Windows Universal应用程序通过单个代码库定位多种类型的设备。如果您参考Windows 8.1或Windows 10,请指定其他标签。

如何在Surface平板上进行调试,而不需要每次要测试时打包传输?

我想通过连接 USB 电缆来调试我的 Surface 平板电脑上的 UWP 应用程序,就像我们在 Android 和 iOS 开发中所做的那样。目前,我正在

回答 1 投票 0

UWP - 如何平铺背景图像?

在通用 Windows 应用程序中,我尝试使用背景图像(来自 ImageSource)并将其平铺在控件上。 XAML 在通用 Windows 应用程序中,我尝试使用背景图像(来自 ImageSource)并将其平铺到控件上。 XAML <Grid x:Name="gridBackground"> <ContentPresenter /> </Grid> C# void UpdateBackground(ImageSource source) { // ... gridBackground.Background = new ImageBrush { ImageSource = source, Stretch = Stretch.None }; } 根据MSDN,ImageBrush继承自TileBrush。它甚至说: 用于 ImageBrush,包括文本或平铺的装饰效果 控件或布局容器的背景。 我认为如果禁用拉伸,这应该平铺图像,但可惜,它只是在控件的中间绘制图像。我没有看到任何实际属性可以使其平铺。 在 WPF 中,有一个 TileMode 属性,可以设置 ViewPort 来指定图块的尺寸。但这在通用平台下似乎不存在。 上一个问题指的是WinRT(Windows 8),但我希望有一个基于画笔的解决方案,而不是用图像填充画布。 如何使用 UWP 平铺背景图像? 之前的问题涉及 WinRT (Windows 8),但我希望有一个基于画笔的解决方案,而不是用图像填充画布。 目前,在 UWP 应用中以平铺模式显示背景图像只有两种解决方案,您知道的第一个解决方案是填充画布。 我使用的第二个是创建一个Panel并在上面绘制图像,这个想法源自这篇文章 这种方法的作用是滥用我们在矩形中绘制重复的线条组这一事实。首先,它尝试在顶部绘制一个与我们的图块高度相同的块。然后它向下复制该块,直到到达底部。 我修改了一些代码并修复了一些问题: public class TiledBackground : Panel { public ImageSource BackgroundImage { get { return (ImageSource)GetValue(BackgroundImageProperty); } set { SetValue(BackgroundImageProperty, value); } } // Using a DependencyProperty as the backing store for BackgroundImage. This enables animation, styling, binding, etc... public static readonly DependencyProperty BackgroundImageProperty = DependencyProperty.Register("BackgroundImage", typeof(ImageSource), typeof(TiledBackground), new PropertyMetadata(null, BackgroundImageChanged)); private static void BackgroundImageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((TiledBackground)d).OnBackgroundImageChanged(); } private static void DesignDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((TiledBackground)d).OnDesignDataChanged(); } private ImageBrush backgroundImageBrush = null; private bool tileImageDataRebuildNeeded = true; private byte[] tileImagePixels = null; private int tileImageWidth = 0; private int tileImageHeight = 0; private readonly BitmapPixelFormat bitmapPixelFormat = BitmapPixelFormat.Bgra8; private readonly BitmapTransform bitmapTransform = new BitmapTransform(); private readonly BitmapAlphaMode bitmapAlphaMode = BitmapAlphaMode.Straight; private readonly ExifOrientationMode exifOrientationMode = ExifOrientationMode.IgnoreExifOrientation; private readonly ColorManagementMode coloManagementMode = ColorManagementMode.ColorManageToSRgb; public TiledBackground() { this.backgroundImageBrush = new ImageBrush(); this.Background = backgroundImageBrush; this.SizeChanged += TiledBackground_SizeChanged; } private async void TiledBackground_SizeChanged(object sender, SizeChangedEventArgs e) { await this.Render((int)e.NewSize.Width, (int)e.NewSize.Height); } private async void OnBackgroundImageChanged() { tileImageDataRebuildNeeded = true; await Render((int)this.ActualWidth, (int)this.ActualHeight); } private async void OnDesignDataChanged() { tileImageDataRebuildNeeded = true; await Render((int)this.ActualWidth, (int)this.ActualHeight); } private async Task RebuildTileImageData() { BitmapImage image = BackgroundImage as BitmapImage; if ((image != null) && (!DesignMode.DesignModeEnabled)) { string imgUri = image.UriSource.OriginalString; if (!imgUri.Contains("ms-appx:///")) { imgUri += "ms-appx:///"; } var imageSource = new Uri(imgUri); StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(imageSource); using (var imageStream = await storageFile.OpenAsync(FileAccessMode.Read)) { BitmapDecoder decoder = await BitmapDecoder.CreateAsync(imageStream); var pixelDataProvider = await decoder.GetPixelDataAsync(this.bitmapPixelFormat, this.bitmapAlphaMode, this.bitmapTransform, this.exifOrientationMode, this.coloManagementMode ); this.tileImagePixels = pixelDataProvider.DetachPixelData(); this.tileImageHeight = (int)decoder.PixelHeight; this.tileImageWidth = (int)decoder.PixelWidth; } } } private byte[] CreateBackgroud(int width, int height) { int bytesPerPixel = this.tileImagePixels.Length / (this.tileImageWidth * this.tileImageHeight); byte[] data = new byte[width * height * bytesPerPixel]; int y = 0; int fullTileInRowCount = width / tileImageWidth; int tileRowLength = tileImageWidth * bytesPerPixel; //Stage 1: Go line by line and create a block of our pattern //Stop when tile image height or required height is reached while ((y < height) && (y < tileImageHeight)) { int tileIndex = y * tileImageWidth * bytesPerPixel; int dataIndex = y * width * bytesPerPixel; //Copy the whole line from tile at once for (int i = 0; i < fullTileInRowCount; i++) { Array.Copy(tileImagePixels, tileIndex, data, dataIndex, tileRowLength); dataIndex += tileRowLength; } //Copy the rest - if there is any //Length will evaluate to 0 if all lines were copied without remainder Array.Copy(tileImagePixels, tileIndex, data, dataIndex, (width - fullTileInRowCount * tileImageWidth) * bytesPerPixel); y++; //Next line } //Stage 2: Now let's copy those whole blocks from top to bottom //If there is not enough space to copy the whole block, skip to stage 3 int rowLength = width * bytesPerPixel; int blockLength = this.tileImageHeight * rowLength; while (y <= (height - tileImageHeight)) { int dataBaseIndex = y * width * bytesPerPixel; Array.Copy(data, 0, data, dataBaseIndex, blockLength); y += tileImageHeight; } //Copy the rest line by line //Use previous lines as source for (int row = y; row < height; row++) Array.Copy(data, (row - tileImageHeight) * rowLength, data, row * rowLength, rowLength); return data; } private async Task Render(int width, int height) { Stopwatch fullsw = Stopwatch.StartNew(); if (tileImageDataRebuildNeeded) await RebuildTileImageData(); if ((height > 0) && (width > 0)) { using (var randomAccessStream = new InMemoryRandomAccessStream()) { Stopwatch sw = Stopwatch.StartNew(); var backgroundPixels = CreateBackgroud(width, height); sw.Stop(); Debug.WriteLine("Background generation finished: {0} ticks - {1} ms", sw.ElapsedTicks, sw.ElapsedMilliseconds); BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, randomAccessStream); encoder.SetPixelData(this.bitmapPixelFormat, this.bitmapAlphaMode, (uint)width, (uint)height, 96, 96, backgroundPixels); await encoder.FlushAsync(); if (this.backgroundImageBrush.ImageSource == null) { BitmapImage bitmapImage = new BitmapImage(); randomAccessStream.Seek(0); bitmapImage.SetSource(randomAccessStream); this.backgroundImageBrush.ImageSource = bitmapImage; } else ((BitmapImage)this.backgroundImageBrush.ImageSource).SetSource(randomAccessStream); } } else this.backgroundImageBrush.ImageSource = null; fullsw.Stop(); Debug.WriteLine("Background rendering finished: {0} ticks - {1} ms", fullsw.ElapsedTicks, fullsw.ElapsedMilliseconds); } } 用途: <Grid x:Name="rootGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <tileCtrl:TiledBackground BackgroundImage="Assets/avatar1.png" Width="{Binding ActualWidth, ElementName=rootGrid}" Height="{Binding ActualHeight, ElementName=rootGrid}"/> </Grid> 查看解决方案 Github 所有这些变体对于 GPU 来说都很沉重。您应该使用 BorderEffect 通过 Composition API 来实现。 var compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; var canvasDevice = CanvasDevice.GetSharedDevice(); var graphicsDevice = CanvasComposition.CreateCompositionGraphicsDevice(compositor, canvasDevice); var bitmap = await CanvasBitmap.LoadAsync(canvasDevice, new Uri("ms-appx:///YourProject/Assets/texture.jpg")); var drawingSurface = graphicsDevice.CreateDrawingSurface(bitmap.Size, DirectXPixelFormat.B8G8R8A8UIntNormalized, DirectXAlphaMode.Premultiplied); using (var ds = CanvasComposition.CreateDrawingSession(drawingSurface)) { ds.Clear(Colors.Transparent); ds.DrawImage(bitmap); } var surfaceBrush = compositor.CreateSurfaceBrush(drawingSurface); surfaceBrush.Stretch = CompositionStretch.None; var border = new BorderEffect { ExtendX = CanvasEdgeBehavior.Wrap, ExtendY = CanvasEdgeBehavior.Wrap, Source = new CompositionEffectSourceParameter("source") }; var fxFactory = compositor.CreateEffectFactory(border); var fxBrush = fxFactory.CreateBrush(); fxBrush.SetSourceParameter("source", surfaceBrush); var sprite = compositor.CreateSpriteVisual(); sprite.Size = new Vector2(1000000); sprite.Brush = fxBrush; ElementCompositionPreview.SetElementChildVisual(YourCanvas, sprite); 我尝试了 1000000x1000000 大小的精灵,并且毫不费力地工作了。 如果您的尺寸大于 16386px,Win2d 会抛出异常。 实际上,现在可以创建自定义画笔(借助 Composition API 和 Win2D)来实现平铺效果。代码示例在这里:UWP TiledBrush 简而言之,您只需子类化 XamlCompositionBrushBase 并重写它的 OnConnected 方法: public class TiledBrush : XamlCompositionBrushBase { protected override void OnConnected() { var surface = LoadedImageSurface.StartLoadFromUri(ImageSourceUri); var surfaceBrush = Compositor.CreateSurfaceBrush(surface); surfaceBrush.Stretch = CompositionStretch.None; var borderEffect = new BorderEffect() { Source = new CompositionEffectSourceParameter("source"), ExtendX = Microsoft.Graphics.Canvas.CanvasEdgeBehavior.Wrap, ExtendY = Microsoft.Graphics.Canvas.CanvasEdgeBehavior.Wrap }; var borderEffectFactory = Compositor.CreateEffectFactory(borderEffect); var borderEffectBrush = borderEffectFactory.CreateBrush(); borderEffectBrush.SetSourceParameter("source", surfaceBrush); } } 然后按预期使用它: <Grid> <Grid.Background> <local:TiledBrush ImageSourceUri="Assets/Texture.jpg" /> </Grid.Background> </Grid> 查看我对这个问题的回答: 您可以使用 Win2D 库进行平铺。他们也有示例代码; “效果”下有一个平铺示例(EffectsSample.xaml.cs)。 我们在 Windows 社区工具包中有 TilesBrush: <Border BorderBrush="Black" BorderThickness="1" VerticalAlignment="Center" HorizontalAlignment="Center" Width="400" Height="400"> <Border.Background> <brushes:TilesBrush TextureUri="ms-appx:///Assets/BrushAssets/TileTexture.png"/> </Border.Background> </Border> 我们还有 TileControl 允许动画。 评论从C#使用Win2d时必须注意内存泄漏。如果您想动态更改位图资源,还有一些微妙之处。 请参阅此问题的答案,了解这些问题的一种解决方案:在 WinUI 3 中重复画笔或图像平铺 WindowsCompositorSamples 中的“边框”示例也展示了如何执行此操作,以及旋转和缩放。 链接:https://github.com/microsoft/WindowsCompositionSamples/tree/master/SampleGallery/Samples/SDK%2015063/BorderPlayground 伙计们,TilesBrush 是更简单的选择。 需要 10 秒和一行代码。

回答 8 投票 0

使内容对话框像 Groove 应用程序中的对话框一样可移动

我创建了一个 ContentDialog 来应用样式(我无法将其应用于消息对话框和弹出窗口),但我遇到了问题,它不可移动,或者我无法像框架那样关闭它出现

回答 4 投票 0

使用鼠标和触摸在 ScrollViewer 中的 Canvas 中绘制矩形

我在 ScrollViewer 中得到了一个 Canvas。 我在 ScrollViewer 中有一个 Canvas。 <ScrollViewer x:Name="svWorkSpace" Visibility="Collapsed" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Tapped="svWorkSpace_Tapped" PointerPressed="svWorkSpace_PointerPressed" PointerMoved="svWorkSpace_PointerMoved" PointerReleased="svWorkSpace_PointerReleased"> <Grid> <Image x:Name="cvWorkImage"/> <Canvas x:Name="cvWorkSpace"/> </Grid> </ScrollViewer> 在 PointerPressed 代码中,我捕获起点,在 PointerMoved 代码中,我在指针移动时绘制一个矩形(也删除我移动的尾随矩形,仅在画布中保留一个矩形。我使用以下方法实现矩形大小调整效果这个方法)。 PointerReleased 将接受最后一个矩形。 在支持触摸的设备中使用鼠标一切正常,但不使用手指。当我移动手指时图像就会滚动。 尝试将代码移至 Canvas 中,如下所示。无法同时使用鼠标和触摸绘制矩形。 <ScrollViewer x:Name="svWorkSpace" Visibility="Collapsed" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> <Grid> <Image x:Name="cvWorkImage"/> <Canvas x:Name="cvWorkSpace" Tapped="svWorkSpace_Tapped" PointerPressed="svWorkSpace_PointerPressed" PointerMoved="svWorkSpace_PointerMoved" PointerReleased="svWorkSpace_PointerReleased"/> </Grid> </ScrollViewer> 请给我指出正确的方向。 当 ScrollViewer 接收到基于触摸的 PointerPressed 时,它会转向直接操作以响应地处理平移和缩放。直接操作捕获指针输入,因此 Canvas 的 PointerMoved 和 PointerReleased 事件不会触发。没有事件 -> 没有绘图。 ScrollViewer 使用鼠标平移或缩放,因此鼠标事件可以到达画布。 假设您总是希望 Canvas 处理指针事件而不是滚动(也许 Grid 中还有其他控件使用 ScrollViewer),您可以将 Canvas 的 ManipulationMone 设置为 all 以让 Canvas 块上的触摸触摸滚动查看器 <Canvas x:Name="cvWorkSpace" Background={ThemeResource WorkSpaceBackgroundBrush} Tapped="svWorkSpace_Tapped" ManipulationMode="All" PointerPressed="svWorkSpace_PointerPressed" PointerMoved="svWorkSpace_PointerMoved" PointerReleased="svWorkSpace_PointerReleased"/> 如果您只是有时希望 Canvas 处理指针事件,那么您可以将 ManipulationMode 切换回 System,让 ScrollViewer 处理它。如果您想通过单点触摸在画布上绘图并通过多点触摸平移/缩放,那么您可以处理画布上的操纵事件以平移和缩放。 还要确保画布不透明,并让指针事件传递到其后面的任何内容。如果你想在图像上绘图,你可以设置一个 ImageBrush,将图像作为 Canvas 的背景,而不是使用单独的 Image 控件。 10年前的一个答案现在对我有帮助。非常感谢。

回答 2 投票 0

如何在UWP\C#中使用NotifyIcon

可以在项目 UWP 中使用 NotifyIcon 类吗?

回答 1 投票 0

样式设置器中的 UWP 绑定不起作用

我在创建 xaml 控件时遇到问题。我正在 VS 2015 的通用应用程序中编写新项目。我想创建网格。在这个网格中我想要一个按钮。在模型中,我指定了列(级别)和 R...

回答 2 投票 0

如何确定 Windows 应用商店/通用应用程序中哪个 Dll 依赖项加载失败?

运行我正在处理的 UWP 项目时,我收到以下对话框。 “无法激活 Windows 应用商店应用程序‘MyAppsMangledName’。‘MyExeName’进程已启动,但激活请求失败...

回答 1 投票 0

如何在 Visual Studio 2022 中使用 Javascript + Html 制作 Windows 通用应用程序

我有一堆在 Visual Studio 2017 中制作的应用程序 - 我需要编辑其中一个,但不幸的是我无法找到安装 Visual Studio 2017 Community 的方法,所以我决定下一个最好的。 .

回答 1 投票 0

Binding 和 x:Bind 的区别

UWP 中使用什么,Binding 或 x:Bind,它们之间有什么区别? 因为我看到很多帖子中人们使用 Binding,而我只在 UWP 中使用 x:Bind 进行 Bind。 仅在 MSDN 主页上

回答 3 投票 0

如何在通用Windows平台中检查互联网连接类型

我想检查 Windows 通用应用程序中的互联网连接类型。 未连接 通过无线局域网(WiFi)连接 通过 WWAN(蜂窝数据)连接 连接到按流量计费的网络 在或...

回答 4 投票 0

FilePicker PickSingleFileAsync() 调用上的 COMException^

我正在尝试制作一个游戏(通用DX11应用程序),在某些时候我需要访问图像库以允许用户选择头像。但由于某种原因,在选择器上调用 PickSingleFileAsync 会出现...

回答 2 投票 0

在uwp中的xaml布局中访问.resx字符串资源

我想直接在我的xaml布局中访问资源,官方文档给了我们一些糟糕的例子,所以我无法让它工作。假设以下 Resources.resw : 我可以从...访问我的字符串资源

回答 2 投票 0

如何在 Microsoft Store API 中获取唯一的用户 ID

我使用 Microsoft Store API(以下简称“API”)来支持用户进行应用内购买(插件)。 例如... 公共 StoreContext storeContext = StoreContext.GetDefault(); GetAppLicenseAsync();

回答 2 投票 0

分辨率提高时 MediaCapture 预览被破坏

我的应用程序需要拍照,我从 uwp 示例中窃取了 MediaCapture 的大部分优点。但是,默认行为会创建分辨率非常低的照片 (640x480 => 52KB)。 我可以设置

回答 1 投票 0

自动增量无法与 Windows Phone 通用应用程序中的 sqlite-net 客户端一起使用

我在 Windows Phone 通用应用程序中使用 sqlite-net for sqlite 我有以下具有表和列属性的类,并使用异步连接在 sqlite 中添加数据,所有这些都正常工作...

回答 4 投票 0

使用 OnlineIdAuthenticator 在 Azure 应用服务中获取 NameIdentifier 声明

我正在使用 OnlineIdAuthenticator 类获取身份验证令牌以登录 Azure 应用服务,但我无法获取 NameIdentifier 声明服务器端。我需要唯一的 ID...

回答 1 投票 0

从命令行构建 Windows 通用 C# 类库

我目前正在尝试构建一个针对 Windows Phone 8.1、Windows 应用程序 8.1 和 Windows 10 通用应用程序的 Microsoft 运行时组件 C# 类库。为了完成这个介绍,我的环境...

回答 2 投票 0

如何使用 UWP AudioGraph 创建音频淡入效果?

我有一个播放音频文件的应用程序。当用户开始音频播放时,我希望音频在 300 毫秒或类似的时间内从有效的 0 音量淡入到 1。 我玩过...

回答 1 投票 0

无法在 Windows 10 UWP 中使用 HIDDevice 类打开 HID USB 设备

以下代码在某些Windows 10系统中返回null currentDevice = 等待 HidDevice.FromIdAsync(devices.ElementAt(0).Id, 文件访问模式.ReadWrite); 我发现了

回答 2 投票 0

轮询西门子徽标设备时出现System.IO.IOException

我是 Modbus 和 UWA 的新手,我正在尝试创建一个应用程序,从我的西门子徽标设备 (6ED1052-1HB08-0BA0 LOGO!24RCE) 读取输入 1、输出 1 和输出 2 的状态。标志是...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.