WPF中如何让一个元素与另一个元素重叠?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中如何让一个元素与另一个元素重叠?相关的知识,希望对你有一定的参考价值。

例如有一个Image元素、一个Button元素、一个TextBox元素。

三个元素水平对齐,Image元素遮挡住Button元素的50%,button元素遮挡TextBOx元素50%。

请问这样的重叠该怎样设置?我想弄一个自定义控件弹窗,按某按钮后可以在ListView等控件上弹出自定义控件。

层叠最好用的控件是grid新建一个页面 复制一下grid内的代码如下:

<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),其中Na的长度,MB 的长度。 对于您正在使用整数,如果您可以接受为一个集合花费几个字节的空间 (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中如何让一个元素与另一个元素重叠?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有元素重叠的情况下在 java 中使用布局?

如何检查时间段是否与另一个时间段重叠,而与AM / PM无关

如何让两个div重叠?

如何重叠包含形状的元素

片段中的视频视图与另一个片段重叠

如何防止文本与页面底部的元素重叠