সীমানা ছাড়াই ডাব্লুপিএফ উইন্ডো কীভাবে তৈরি করা যায় যা কেবল একটি গ্রিপের মাধ্যমে আকার পরিবর্তন করতে পারে?


95

আপনি যদি ResizeMode="CanResizeWithGrip"একটি ডাব্লুপিএফ সেট করে Windowথাকেন তবে নীচের মত নীচের ডানদিকে একটি আকার বদলে গ্রিপ প্রদর্শিত হবে:

যদি আপনি WindowStyle="None"পাশাপাশি সেট করেন তবে শিরোনাম দণ্ডটি অদৃশ্য হয়ে যায় তবে ধূসর বেভেলড প্রান্তটি আপনি সেট না করা অবধি থাকে ResizeMode="NoResize"। দুর্ভাগ্যক্রমে, বৈশিষ্ট্যগুলির এই সংমিশ্রণের সাথে, আকারের গ্রিপটিও অদৃশ্য হয়ে যায়।

আমি ওভাররাইড আছে Window'র ControlTemplateএকটি কাস্টম মাধ্যমে Style। আমি নিজে উইন্ডোটির সীমানা নির্দিষ্ট করতে চাই এবং চারদিক থেকে আমার উইন্ডোটির আকার পরিবর্তন করতে সক্ষম হওয়া প্রয়োজন, তবে আমার পুনরায় আকারের গ্রিপ দরকার।

এই সমস্ত মানদণ্ড পূরণের জন্য কেউ কি কোনও সহজ উপায় বিশদ করতে পারেন?

  1. Windowআমি নিজেকে যেটিতে নির্দিষ্ট করেছিলাম তার বাইরে কোনও সীমানা থাকবে নাControlTemplate
  2. না নীচের ডান কোণে একটি কাজ পুনরায় আকার দেওয়ার খপ্পর আছে।
  3. না টাইটেল বার আছে।

4
দয়া করে নোট করুন যে Allowtranspency মেমরি ফাঁস তৈরি করে। সুতরাং এটি ব্যবহার এড়ানো। অনুগ্রহ করে সোশ্যাল.এমএসএনএন.মাইক্রোসফট.ফরমেশন
দীপেশ ভট্ট

4
@ দিপেশবট্ট আপনার প্রদত্ত লিঙ্কটিতে আমি এই দাবির কোনও ব্যাখ্যা পাইনি। হতে পারে আপনি লিঙ্কটি সামাজিক.এমএসএনএন.মাইক্রোসফট.ফরমেশনস
ভিস্টুডিও /

আমি শীর্ষে ধূসর প্রান্তের মুখোমুখি হয়েছি যদিও আমি উইন্ডো স্টাইলটি কোনওটিতেই সেট করে নেই। রেজাইজমোড = "NoResize" আমার সমস্যার সমাধান করেছে।
সুরেন্দ্র শ্রেষ্ঠ

উত্তর:


184

যদি আপনি AllowsTransparencyসম্পত্তি নির্ধারণ করেন Window(এমনকি কোনও স্বচ্ছ মান নির্ধারণ না করে) সীমান্তটি অদৃশ্য হয়ে যায় এবং আপনি কেবল গ্রিপ দিয়ে পুনরায় আকার দিতে পারেন।

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="640" Height="480" 
    WindowStyle="None"
    AllowsTransparency="True"
    ResizeMode="CanResizeWithGrip">

    <!-- Content -->

</Window>

ফলাফল দেখে মনে হচ্ছে:


খাঁটি ফ্লুক আমি জানতাম - আমি আজ বিকেলে একই কন্ট্রোল সেট নিয়ে খেলছিলাম। :)
জম্বিশিপ 16

4
বাহ, আমি এটি আশা করবো না, তবে এটি 5 মিনিটের মধ্যে নিজের পোস্ট-এর নোটগুলি তৈরির জন্য সম্পূর্ণ কার্যকর, ধন্যবাদ :)
টমো কাফকা

4
AllowTranspender এর বেশ কয়েকটি পতন রয়েছে যদিও উইন্ডোজ আর সাব উইন্ডো নিয়ন্ত্রণ করতে পারে না এটি ছিল ওয়েব ব্রাউজার, সাধারণত সফ্টওয়্যার রেন্ডারিংয়ের জন্য বাধ্য করে, মেমোরি ফাঁসের খবর দিয়েছে। নীচে আমার কাজ দেখুন।
Wobbles

সীমানা থেকে মুক্তি পেতে আপনার কেবল উইন্ডোস্টাইল = "কিছুই নয়"; অনুমতি ট্রান্সপারেন্সি কেবল এটির প্রয়োজন হয়, তবে সীমান্তগুলিকে প্রভাবিত করে না ..
গ্রেট

4
@ গ্রাউটগুলি উইন্ডো শিরোনাম থেকে মুক্তি পেয়েছে তবে ফর্মটির চারপাশে এখনও একটি শক্ত সীমানা রয়েছে। অনুমতি ট্রান্সপারেন্সি সীমানা থেকে পরিত্রাণ পেতে।
ওবলস

81

আমি এটি দিয়ে একটি সীমান্তহীন উইন্ডো তৈরি করার চেষ্টা করছিলাম WindowStyle="None"কিন্তু যখন আমি এটি পরীক্ষা করেছি, মনে হচ্ছে শীর্ষে একটি সাদা বার উপস্থিত রয়েছে, কিছু গবেষণা শেষে এটি একটি "আকার পরিবর্তন সীমানা" বলে মনে হয়, এখানে একটি চিত্র রয়েছে (আমি হলুদে মন্তব্য করেছি):

চ্যালেঞ্জ

ইন্টারনেটে কিছু গবেষণা করার পরে এবং প্রচুর অসুবিধাবিহীন এক্সএএমএল সমাধানের পরে, আমি যে সমস্ত সমাধান পেয়েছি সেগুলি সি # এবং কোড কোডের প্রচুর কোডের পিছনে ছিল, আমি এখানে পরোক্ষভাবে সমাধানটি পেয়েছি: সর্বাধিক কাস্টম উইন্ডো ড্রপ ছায়া প্রভাব হারিয়ে ফেলে

<WindowChrome.WindowChrome>
    <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

দ্রষ্টব্য : আপনাকে .NET 4.5 কাঠামো ব্যবহার করতে হবে বা আপনি যদি কোনও পুরানো সংস্করণ ব্যবহার করছেন তবে ডাব্লুপিএফসেল ব্যবহার করুন, কেবল শেলটি উল্লেখ করুন এবং Shell:WindowChrome.WindowChromeপরিবর্তে ব্যবহার করুন।

আমি WindowChromeউইন্ডোর বৈশিষ্ট্যটি ব্যবহার করেছি , আপনি যদি এটি ব্যবহার করেন তবে সাদা "আকার পরিবর্তনকারী সীমানা" অদৃশ্য হয়ে যায়, তবে সঠিকভাবে কাজ করার জন্য আপনাকে কিছু বৈশিষ্ট্য সংজ্ঞায়িত করতে হবে।

ক্যাপশনহাইট: এটি ক্যাপশন ক্ষেত্রের উচ্চতা (হেডারবার) যা অ্যারো স্ন্যাপের জন্য অনুমতি দেয়, সাধারণ শিরোনাম বারের মতো ডাবল ক্লিক করার আচরণ করে। বোতামগুলি কাজ করতে এটি 0 (শূন্য) এ সেট করুন।

রেজাইজবোর্ডারহিকনেস: এটি উইন্ডোর প্রান্তে বেধ যা আপনি যেখানে উইন্ডোটির আকার পরিবর্তন করতে পারেন। আমি 5 এ রেখেছি কারণ আমি এই নম্বরটি পছন্দ করি এবং আপনি যদি উইন্ডোটির আকার পরিবর্তন করতে শূন্য করে থাকেন তবে।

এই শর্ট কোডটি ব্যবহার করার পরে ফলাফলটি হ'ল:

সমাধান

এবং এখন, সাদা সীমান্ত ব্যবহার না করেই উধাও হয়ে ResizeMode="NoResize"এবং AllowsTransparency="True", এছাড়াও এটি উইন্ডোতে একটি ছায়া দেখা যাবে।

পরে আমি সহজ এবং সংক্ষিপ্ত কোড সহ সহজেই কীভাবে বোতামগুলি (আমি বোতামগুলির জন্য চিত্র ব্যবহার করিনি) তা কীভাবে করব তা ব্যাখ্যা করব, আমি নতুন এবং আমার মনে হয় যে আমি কোডপোজেজে পোস্ট করতে পারি, কারণ এখানে আমি জায়গাটি খুঁজে পাইনি টিউটোরিয়াল পোস্ট করতে।

হতে পারে আরও একটি সমাধান রয়েছে (আমি জানি যে আমার মতো নুবুদের জন্য কঠোর এবং কঠিন সমাধান রয়েছে) তবে এটি আমার ব্যক্তিগত প্রকল্পগুলির জন্য কাজ করে।

এখানে সম্পূর্ণ কোড

<Window x:Class="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:Concursos"
    mc:Ignorable="d"
    Title="Concuros" Height="350" Width="525"
    WindowStyle="None"
    WindowState="Normal" 
    ResizeMode="CanResize"
    >
<WindowChrome.WindowChrome>
    <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

    <Grid>

    <Rectangle Fill="#D53736" HorizontalAlignment="Stretch" Height="35" VerticalAlignment="Top" PreviewMouseDown="Rectangle_PreviewMouseDown" />
    <Button x:Name="Btnclose" Content="r" HorizontalAlignment="Right" VerticalAlignment="Top" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
    <Button x:Name="Btnmax" Content="2" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,35,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
    <Button x:Name="Btnmin" Content="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,70,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>

</Grid>

ধন্যবাদ!


4
ভাল, এই এক জন্য কুডোস! এটি এই থ্রেডের উত্তর সর্বাধিক সরল / কোনও ব্যবসায়িক উত্তর নেই! আরও অনেক বেশি 'ভোট' দেওয়া উচিত। আমাকে স্বীকার করতে হবে যে আমি এটি সম্পর্কে এক ধরণের সেপটিক ছিলাম, বিশেষত হুডের নীচে কী ঘটছিল। এমনকি আমি ডাব্লুএফপি গাছটিও পরীক্ষা করে দেখেছি এবং নিশ্চিত হয়ে গেছে যে স্বচ্ছতা আর যুক্ত হয়নি। এমনকি 'ওয়েব ব্রাউজার' প্রদর্শনের মতো ছদ্মবেশী নিয়ন্ত্রণগুলিও ঠিক আছে। অ্যাপ্লিকেশনটি প্রচুর চাপের মধ্যে থাকা অবস্থায় স্বচ্ছতা ব্যবহার করে আমার একটি রেন্ডারিং জমাট বাঁধার সমস্যা ছিল ... ঠিক আছে, এই সমাধানটি দিয়ে এটি ঘটছে না। আমার মনে হয় @ ওয়াবলস সলিউশন অবসর নেওয়ার সময় হতে পারে!
VeV

4
মনে হচ্ছে এটিকে এখনও উইন্ডো টেনে আনার জন্য ইন্টারপ দরকার হতে পারে যদি আমি Rectangle_PreviewMouseDownইভেন্টটির ব্যবহারটি সঠিকভাবে ব্যাখ্যা করি ।
ওয়াবলস

এটি <= Win 8.1- এ কাজ করতে পারে না, আমার ভিএম-তে কিছু বিজোড় ফলাফল দেখে। উইন্ডোজ 7 এবং 8 হ'ল প্রাথমিক উদ্বেগ কারণ তারা বোকা অ্যারো সীমান্ত জিনিসটি করে।
ওয়াবলস

আপনার জবাবের জন্য আপনাকে ধন্যবাদ
ফার্নান্দো আগুয়েরে

হাই @ ফার্নান্দো অগুইরে, আমি এই সম্পর্কিত প্রশ্ন পোস্ট করেছি এবং আপনার যদি উত্তর থাকে তবে কৃতজ্ঞ হব।
সাম্পাথস্রিস

40

যদিও গৃহীত উত্তরটি খুব সত্য, কেবলমাত্র এটি উল্লেখ করতে চাই যে AllowTranspender এর কিছু অবক্ষয় রয়েছে। এটি চাইল্ড উইন্ডো নিয়ন্ত্রণগুলি, অর্থাৎ ওয়েব ব্রাউজারকে দেখাতে দেয় না এবং এটি সাধারণত সফ্টওয়্যার রেন্ডারিংয়ে বাধ্য করে যার নেতিবাচক কার্যকারিতা প্রভাব ফেলতে পারে।

যদিও কাছাকাছি একটি আরও ভাল কাজ আছে।

আপনি যখন এমন কোনও উইন্ডো তৈরি করতে চান যখন এমন কোনও সীমানা নেই যা আকার পরিবর্তনযোগ্য এবং কোনও ওয়েব ব্রাউজার নিয়ন্ত্রণ বা ফ্রেম নিয়ন্ত্রণ হোস্ট করতে সক্ষম করতে পারে এমন কোনও ইউআরএলকে নির্দেশ করতে পারে যা আপনি সহজেই পারেন না, যখন বলেছিলেন নিয়ন্ত্রণের সামগ্রীগুলি খালি প্রদর্শিত হবে show

আমি যদিও একটি workaround খুঁজে পেয়েছি; উইন্ডোতে, যদি আপনি উইন্ডো স্টাইলকে কোনওটিতে সেট করেন না, রেজাইজমোড থেকে নো রাইজাইজে রাইজডমড করুন (আমার সাথে বহন করুন, আপনি একবারে পুনরায় আকার পরিবর্তন করতে সক্ষম হবেন) তারপরে নিশ্চিত হয়ে নিন যে আপনি অচলিত অনুমোদনের স্বচ্ছতা আপনার কাছে কোনও সীমানা ছাড়াই স্থির আকারের উইন্ডো থাকবে এবং প্রদর্শিত হবে ব্রাউজার নিয়ন্ত্রণ।

এখন, আপনি সম্ভবত এখনও ডান আকার পরিবর্তন করতে সক্ষম হতে চান? ভাল আমরা একটি আন্তঃ কল দিয়ে এটি করতে পারি:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();

    //Attach this to the MouseDown event of your drag control to move the window in place of the title bar
    private void WindowDrag(object sender, MouseButtonEventArgs e) // MouseDown
    {
        ReleaseCapture();
        SendMessage(new WindowInteropHelper(this).Handle,
            0xA1, (IntPtr)0x2, (IntPtr)0);
    }

    //Attach this to the PreviewMousLeftButtonDown event of the grip control in the lower right corner of the form to resize the window
    private void WindowResize(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
    {
        HwndSource hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        SendMessage(hwndSource.Handle, 0x112, (IntPtr)61448, IntPtr.Zero);
    }

এবং ভয়েলা, ওয়েব ব্রাউজারের মতো কন্ট্রোলগুলির সাথে সামঞ্জস্যতা হারানো ছাড়া কোনও সীমানাবিহীন একটি ডাব্লুপিএফ উইন্ডো এবং এখনও চলমান এবং পুনরায় আকারযুক্ত


আমরা কেবল নীচে ডানদিকে নয়, চারপাশ থেকে আকার পরিবর্তন করতে চাই, তবে এখনও কোনও সীমানা দৃশ্যমান না চাইলে কীভাবে চলব?
ড্যানিয়েল

6
এখানে অন্যান্য ডাব্লুপ্রাম মান রয়েছে, কেবল প্রয়োজন হিসাবে নতুন ইউআই অবজেক্টগুলিকে নতুন ইভেন্টগুলি বরাদ্দ করুনprivate enum ResizeDirection { Left = 61441, Right = 61442, Top = 61443, TopLeft = 61444, TopRight = 61445, Bottom = 61446, BottomLeft = 61447, BottomRight = 61448, }
ওয়াবলস

এটি আমার পক্ষে দুর্দান্ত কাজ করে, একটি ব্যতিক্রম ব্যতীত একবার আপনার NoResize হয়ে গেলে আপনি উইন্ডোটিকে আর শীর্ষে টেনে এনে স্নাপ করতে পারবেন না।
সিজেকে

4
@ সিজেকে ট্রু, তবে সন্দেহ নেই যে আপনি উইন্ডোজ বার্তাগুলিও সেটির জন্য ভালভাবে পরিচালনা করতে এবং এটি পরিচালনা করতে পারেন।
ওয়াবলস

আমি উইন্ডো টেনে আনতে পারি না। কোন ধারণা কেন? (
মন্ত্রীর

5

নমুনা এখানে:

<Style TargetType="Window" x:Key="DialogWindow">
        <Setter Property="AllowsTransparency" Value="True"/>
        <Setter Property="WindowStyle" Value="None"/>
        <Setter Property="ResizeMode" Value="CanResizeWithGrip"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Border BorderBrush="Black" BorderThickness="3" CornerRadius="10" Height="{TemplateBinding Height}"
                            Width="{TemplateBinding Width}" Background="Gray">
                        <DockPanel>
                            <Grid DockPanel.Dock="Top">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition></ColumnDefinition>
                                    <ColumnDefinition Width="50"/>
                                </Grid.ColumnDefinitions>
                                <Label Height="35" Grid.ColumnSpan="2"
                                       x:Name="PART_WindowHeader"                                            
                                       HorizontalAlignment="Stretch" 
                                       VerticalAlignment="Stretch"/>
                                <Button Width="15" Height="15" Content="x" Grid.Column="1" x:Name="PART_CloseButton"/>
                            </Grid>
                            <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                                        Background="LightBlue" CornerRadius="0,0,10,10" 
                                        Grid.ColumnSpan="2"
                                        Grid.RowSpan="2">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition Width="20"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="20"></RowDefinition>
                                    </Grid.RowDefinitions>
                                    <ResizeGrip Width="10" Height="10" Grid.Column="1" VerticalAlignment="Bottom" Grid.Row="1"/>
                                </Grid>
                            </Border>
                        </DockPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

24
কোডটি কীভাবে কাজ করে তার একটি সংক্ষিপ্ত বিবরণ অন্তর্ভুক্ত করা উচিত।
এম 456

0

@ ফার্নান্দো-অগুয়েরে WindowChromeকাজ করে উত্তর পেয়ে আমার অসুবিধা হচ্ছে। এটা আমার ক্ষেত্রে কাজ করছিল না, কারণ আমি অগ্রাহ্য করা হয়েছিল OnSourceInitializedমধ্যে MainWindowএবং বেস বর্গ পদ্ধতি কলিং না।

protected override void OnSourceInitialized(EventArgs e)
{
    ViewModel.Initialize(this);
    base.OnSourceInitialized(e); // <== Need to call this!
}

এটি আমাকে দীর্ঘকাল ধরে আটকে রেখেছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.