- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在测试虚拟化面板时,我需要设置 VirtualizingPanel.IsVirtualizing
属性,以便 Teststack.White
可以像与非虚拟化面板一样与它们交互。
这对我很有帮助,尤其是当面板包含大量内容时。
我不想静态设置 VirtualizingPanel.IsVirtualizing
,这样我就不必像那样将它交付给我的客户。
要玩一个最小的例子,你需要一个窗口。
<Window x:Class="DataGridTest.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:DataGridTest"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<DataGrid
AutomationProperties.AutomationId="MyDataGRID"
ItemsSource="{Binding MyItems}"
VirtualizingPanel.IsVirtualizing="True" >
<!-->
"IsVirtualizing Defaults to True."
"Setting this to False makes the test pass but is a poor choice for production code."
"Somehow I need to be able to change this programatically during testing."
</!-->
</DataGrid>
</Window>
上面窗口的代码隐藏。
using System.Collections.Generic;
using System.Windows;
namespace DataGridTest
{
public class Item
{
private string str;
public Item(string str) { this.str = str; }
public string Value { get { return str; } }
public int Length { get { return str.Length; } }
public int Hash { get { return str.GetHashCode(); } }
}
public partial class MainWindow : Window
{
List<Item> myitems;
public List<Item> MyItems { get { return myitems; } }
public MainWindow()
{
InitializeComponent();
myitems = new List<Item>();
for (int i = 0; i < 800; ++i)
{
myitems.Add(new Item($"Item {i}"));
}
DataContext = this;
}
}
}
最后是一个测试项目:
using NUnit.Framework;
using System.Diagnostics;
using TestStack.White;
using TestStack.White.UIItems;
using TestStack.White.UIItems.WindowItems;
namespace NunitTest
{
[TestFixture]
public class Class1
{
private Application app;
private Window window;
[OneTimeSetUp]
public void OneTimeSetUp()
{
ProcessStartInfo info = new ProcessStartInfo( $"{TestContext.CurrentContext.WorkDirectory}/DataGridTest.exe");
info.WorkingDirectory = TestContext.CurrentContext.WorkDirectory;
app = Application.Launch(info);
window = app.GetWindow("MainWindow");
}
[OneTimeTearDown]
public void OneTimeTearDown()
{
window.Close(); window = null;
app.Close(); app = null;
}
[Test]
public void test()
{
ListView list = window.Get<ListView>("MyDataGRID");
SetIsVirtualizing(list, false);
Assert.AreEqual(800, list.Rows.Count, "This fails for virtualized panels");
SetIsVirtualizing(list, true);
}
private void SetIsVirtualizing(ListView list, bool value)
{
//insert magic - I tried a couple of things but I just can not set this dependency property
}
}
}
请帮助理解如何在测试期间设置VirtualizingPanel.IsVirtualizing
。
最佳答案
我在添加折叠文本框以与数据上下文交互方面取得了一些成功。虽然我对该解决方案非常不满意,但它确实通过了测试。
以下是我对代码所做的修改:
窗口
<StackPanel>
<TextBox
AutomationProperties.AutomationId="MyItems_IsVirtualizing_Injector"
Text="{Binding MyItems_IsVirtualizing_Injector}" Visibility="Collapsed"/>
<DataGrid
AutomationProperties.AutomationId="MyDataGRID"
ItemsSource="{Binding MyItems}"
VirtualizingPanel.IsVirtualizing ="{Binding MyItems_IsVirtualizing}"
>
<!-->
"IsVirtualizing Defaults to True."
"Setting this to False makes the test pass but is a poor choice for production code."
"Somehow I need to be able to change this programatically during testing."
</!-->
</DataGrid>
</StackPanel>
代码隐藏
string injector = true.ToString();
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public string MyItems_IsVirtualizing_Injector
{
get { return injector; }
set
{
injector = value;
PropertyChanged(this, new PropertyChangedEventArgs("MyItems_IsVirtualizing_Injector"));
PropertyChanged(this, new PropertyChangedEventArgs("MyItems_IsVirtualizing"));
}
}
public bool MyItems_IsVirtualizing { get { return string.Equals(true.ToString(), MyItems_IsVirtualizing_Injector); } }
测试
private void SetIsVirtualizing(ListView list, bool value)
{
var injector = window.Get<TextBox>("MyItems_IsVirtualizing_Injector");
injector.Text = value.ToString();
}
编辑:因为我的实际用例正在计算元素,所以我实际上选择了另一个可以使用 CountElements(list.AutomationElement)
private static int CountElements(AutomationElement container)
{
var patterns = container.GetSupportedPatterns();
var itemContainer = container.GetCurrentPattern(ItemContainerPattern.Pattern) as ItemContainerPattern;
List<object> elements = new List<object>();
var element = itemContainer.FindItemByProperty(null, null, null);
while (element != null)
{
elements.Add(element);
element = itemContainer.FindItemByProperty(element, null, null);
}
return elements.Count;
}
关于c# - 使用 TestStack.White 设置 `VirtualizingPanel.IsVirtualizing`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42535434/
我有两个使用摩托罗拉手机的人提示我的旋转器是白底白字。由于我只有一台 HTC,因此无法重现。 有没有人遇到过这个问题并解决了它? 最佳答案 为您的微调器和项目创建一个默认布局,它们在每部手机上都是相同
White 正在向控制台输出大量日志,我想将其关闭以查看我的输出。这怎么可能?我尝试了以下但仍然看到日志。是否还有更多代码需要添加? void func() { CoreAppXmlConfi
我正在使用 pygame(1.9.0rc3,虽然这也发生在 1.8.1 中)来创建热图。为了构建热图,我使用了一个小的 24 位 11x11 像素点 PNG 图像,它有一个白色背景和一个非常低不透明度
我正在尝试设置一个非常简单的布局的背景: LinearLayout ll = (LinearLayout) findViewById(R.id.simple_layout); 这个有效: ll
我有多个来自数据库的颜色字符串。对于每种颜色,我将其转换为小写,然后将其传递给内联样式: const color-picker-item = color => ( ) 当传递的颜色是有效的
我正在使用 appcompat v21,以及从 Theme.AppCompat.NoActionBar 继承的样式(主题)。在微调器的弹出窗口中,文本和背景都是白色的。我已经在 Android 4.0
我试图将几个元素排成一行,以便它们都适合容器的宽度。为了防止它们自动换行,我向父级添加了“white-space: nowrap”,并向子级添加了“white-space: normal”以允许它们对
我想弄清楚为什么 mix-blend-mode: color; css 选择器和值会影响除白色以外的所有颜色,而不是影响除白色和黑色以外的所有颜色。有人可以向我解释为什么会这样吗? 最佳答案 来自 t
试飞中的颤动iOS应用程序--白屏只适用于少数用户,但对其他用户来说运行完美。在将iOS应用程序上传到模拟器上的TestFlight之前,该应用程序运行得很好。当我在TestFlight上为4个用户上
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: How to disable highlighting of the app icon? 您好,这是一个 iPhon
我的 WordPress 网站被重定向到另一个网站的恶意软件攻击,它被称为 white.belonnanotservice 有什么解决办法吗? 最佳答案 我的网站有同样的问题。 legalweb 的一
我的 WordPress 网站被重定向到另一个网站的恶意软件攻击,它被称为 white.belonnanotservice 有什么解决办法吗? 最佳答案 我的网站有同样的问题。 legalweb 的一
我在我的项目中使用 iframe,似乎每当它在不透明背景上加载内容时 - 它会在正确显示之前闪烁“白色”大约 1 秒。 它似乎在 jQuery 脚本准备好之前触发了 returned 事件。我已经尝试
我在论坛上搜索了一下,似乎无法弄清楚如何解决加载新页面时白色闪烁的常见问题。 我试过 Chris Coyer 的例子,将它放在我的其他 javascript 之上: // Prevent va
我试图在启动后从主应用程序中获取 2 个编辑框。有时 window.GetMultiple() 只返回 1 个编辑框。有什么方法可以等待元素出现吗? 编辑框没有自动化 ID 或文本。 最佳答案 您可以
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
“红色”和“橙色”之间以及“绿色”和“浅蓝色”之间在两个方向上都有“间隙”(切换到白色)。 你能解释一下,为什么会这样吗? var colors = ["red", "orange", "ye
我刚刚制作了我的第一个事件加载器,我将在将 shipping_estimate.php 文件加载到当前文件时显示它。我还想做的是用半透明的白色图像覆盖旧内容,然后将加载器放在它上面。 我尝试将半透明图
首先,之前可能有人问过这个问题,但我与之关联的通用术语使得它在本质上很难研究。 很简单的问题: 在创建电子邮件模板(特别是在 mailchimp 中)时,如何强制折叠未加载图像的空白区域。 这里的想法
我有一个图像列表,我想根据这些图像隐藏/显示 元素被点击。我已经能够成功地做到这一点,但是,显示的图像下方/上方仍然存在空白。这是我目前使用的代码: HTML CSS
我是一名优秀的程序员,十分优秀!