WPF中如何让一个元素与另一个元素重叠?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中如何让一个元素与另一个元素重叠?相关的知识,希望对你有一定的参考价值。
例如有一个Image元素、一个Button元素、一个TextBox元素。
三个元素水平对齐,Image元素遮挡住Button元素的50%,button元素遮挡TextBOx元素50%。
请问这样的重叠该怎样设置?我想弄一个自定义控件弹窗,按某按钮后可以在ListView等控件上弹出自定义控件。
<Grid>
<Button Name="btnObj1" Content="ok" Margin="0,0,0,14" />
<Button Name="btnObj2"Content="ok" Margin="0,0,0,81" />
</Grid>或者是:
<Grid>
<Button Name="btnObj1" Content="ok" Canvas.Left="100" Canvas.Top ="100" />
<Button Name="btnObj2" Content="ok" Canvas.Left="100" Canvas.Top ="120" />
</Grid>
可以调整其位置,实现 btnObj1和btnObj2的重叠。Canvas控件也一样,只是要注意Canvas是以像素来衡量的位置单位! 参考技术A 这个可以直接在xaml的设计器里完成啊!在设计器里点击右键,有个“顺序“,点它就会有个左拉菜单,就有设置层次的,有四种选择,置于顶层,上移一层,下移一层,置于底层,选择其中一个你认为合适的就行了(一楼的大哥,用样式对初学者来说还是比较麻烦的,这个设计其实完全可以在界面中完成,本人也是做WPF开发,有一年了,有事多交流,O(∩_∩)O谢谢) 参考技术B image button textbox 代码上下顺序排好就行了
如果存在,如何将一个数组的每个元素与另一个元素进行比较,然后打印是,否则为否
【中文标题】如果存在,如何将一个数组的每个元素与另一个元素进行比较,然后打印是,否则为否【英文标题】:How to compare each element of one array to another if present then print Yes otherwise no 【发布时间】:2017-01-29 05:33:35 【问题描述】:#include<iostream>
using namespace std;
int main()
int a[8] = 1, 2, 3, 6, 4, 8, 12, 5 ;
int b[6] = 1, 3, 12, 5, 9, 10 ;
for (int i = 0; i < 8; i++)
for(int j=0;j<6;j++)
if(b[j]==a[i])
cout<<"Yes"<<endl;
cout<<"NO"<<endl;
我必须比较这些数组,并且第二个数组的元素存在于第一个数组中,然后打印 yes else no . 我得到的输出为
Yes
NO
NO
Yes
NO
NO
NO
NO
Yes
NO
Yes
NO
我必须得到这样的输出
yes
yes
yes
yes
No
No
【问题讨论】:
您的程序是用 C++ 编写的,而不是用 C 编写的。由于它们是两种不同的语言,请正确标记您的问题。此外,糟糕的缩进使得很难看出哪些语句属于哪个循环。 先生,请您写 sudo 代码。我是编程新手,我没有得到你。 没有sudo代码,是伪代码。 :) 【参考方案1】:这里要提到的主要一点是,一旦找到匹配项,您需要将break;
退出内部循环。
另外,您需要确保打印任一“是”或“否”。正如您的程序目前所代表的那样,它将在内循环之后无条件地打印“否”。您可以使用标志来完成此操作。
最后,正如您的逻辑状态,"....第二个数组的元素存在于第一个数组中",您需要更改循环结构以反映这一点。外部循环应该用于索引第二个数组b
,而在内部循环中,您应该遍历第一个数组a
。
你需要做类似(伪代码,未测试)
for (int j=0; j<6; j++)
int flag = 0; //reset the flag
for(int i=0; i<8; i++)
if(b[j]==a[i])
cout<<"Yes"<<endl;
flag = 1;
break;
if (!flag) cout<<"NO"<<endl;
【讨论】:
加上反转 for 循环。 @O'Neil 有必要吗? @SouravGhosh 如果他们只想要六个输出结果而不是八个。 @SouravGhosh 据我了解,目的是确定b
的每个元素是否在a
中。
现在应该是标准杆了。【参考方案2】:
根据您在问题中声明的目标,您应该枚举您的第二个数组 (b[]
) 作为您的外循环,在您的第一个数组 (a[]
) 中寻找它的每个值作为内循环,并且大多数重要的是,如果您找到匹配项,则通过检测中断循环(内部循环外部的代码知道您提前中断),从而知道是否应该打印是或否
简而言之,你的算法是倒退的,仍然不完整。修复算法并使用 ranged-for 作为枚举方法(使用它或像现在一样使用下标,由您决定),给我们:
#include <iostream>
int main()
int a[8] = 1, 2, 3, 6, 4, 8, 12, 5 ;
int b[6] = 1, 3, 12, 5, 9, 10 ;
for (auto x : b)
bool found = false;
for (auto y : a)
if (x == y)
found = true;
break;
std::cout << (found ? "Yes" : "NO") << '\n';
输出
Yes
Yes
Yes
Yes
NO
NO
【讨论】:
【参考方案3】:其他答案已经给出了您破坏算法的原因。我想给你一个提示,可以帮助在执行时间方面改进它(当然,一旦固定)。
注意,两个嵌套循环意味着复杂度O(N*M),其中N是a
的长度,M 是B
的长度。
对于您正在使用整数,如果您可以接受为一个集合花费几个字节的空间 (O(N)),则可以将复杂度降低到 O(N+M) 。
此外,整个代码在我看来更容易理解:
#include<iostream>
#include<unordered_set>
int main()
int a[8] = 1, 2, 3, 6, 4, 8, 12, 5 ;
int b[6] = 1, 3, 12, 5, 9, 10 ;
std::unordered_set<int> checka, a+8;
for(int j=0; j<6; j++)
if(check.find(b[j]) != check.cend())
std::cout << "Yes" << std::endl;
else
std::cout << "NO" << std::endl;
基本思路是这样的:
遍历a
并将所有值放入您的集合中
遍历b
并检查集合是否包含_i-th_value
第二步不再需要为b
中的每个值迭代a
。因此,整体复杂性降低了(至少在平均情况下 - 请参阅std::unordered_set
的文档了解更多详细信息)。
【讨论】:
【参考方案4】:更多的 C++ 方法是使用 std::find
(内部 C++11):
#include <algorithm>
#include <iostream>
int main()
int a[8] = 1, 2, 3, 6, 4, 8, 12, 5 ;
int b[6] = 1, 3, 12, 5, 9, 10 ;
for (auto bi : b)
bool found = std::find(std::begin(a), std::end(a), bi) != std::end(a);
std::cout << (found ? "Yes" : "No") << '\n';
【讨论】:
【参考方案5】:我确实对您的程序进行了更改,它给出了预期的输出。
for (int i = 0; i < 6; i++)
int flag = 0;
for(int j=0;j<8;j++)
if(b[i]==a[j]) // take b array value and compare with all elements of a.
cout<<"Yes"<<endl;
flag = b[i];
break;
if (b[i] != flag)
cout<<"NO"<<endl;
【讨论】:
以上是关于WPF中如何让一个元素与另一个元素重叠?的主要内容,如果未能解决你的问题,请参考以下文章