উইন্ডোতে ডাব্লুপিএফ-এর মধ্যে উপাদানটির পরম অবস্থান পান


89

ডাবল ক্লিক করা হলে আমি উইন্ডো / মূল উপাদানটির সাথে সম্পর্কিত কোনও উপাদানের পরম অবস্থান পেতে চাই। এর পিতামাতার মধ্যে উপাদানটির আপেক্ষিক অবস্থানটি আমি যা দেখতে পাই তা কেবলমাত্র এবং আমি যা পেতে চেষ্টা করছি সেটি উইন্ডোটির সাথে সম্পর্কিত point আমি কীভাবে পর্দার কোনও উপাদানটির বিন্দু পেতে পারি তার সমাধানগুলি দেখেছি, তবে উইন্ডোতে নয়।

উত্তর:


130

আমি মনে করি ব্র্যান্ডনএস যা চায় তা মূল উপাদানটির সাথে তুলনামূলকভাবে মাউসের অবস্থান নয় , বরং কিছু বংশধর উপাদানগুলির অবস্থান।

তার জন্য, ট্রান্সফর্মটোঅ্যানস্টোর পদ্ধতি রয়েছে:

Point relativePoint = myVisual.TransformToAncestor(rootVisual)
                              .Transform(new Point(0, 0));

কোথায় myVisualউপাদান যে শুধু ডাবল ক্লিক করা হয়েছিল, এবং rootVisualApplication.Current.MainWindow বা যাই হোক না কেন আপনি চান অবস্থানে আপেক্ষিক।


4
হাই আমি এটি চেষ্টা করেছিলাম এবং আমি নিম্নলিখিত ব্যতিক্রমগুলি পেয়েছি: System.In अवैधOperationException unhandled ম্যাসেজ = নির্দিষ্ট ভিজ্যুয়াল এই ভিজ্যুয়ালটির পূর্বপুরুষ নয়। উত্স = উপস্থাপনা কোর কোন ধারণা?
RoflcoptrException

8
ভিজুয়াল.টান্সফর্মটোঅ্যানস্টোর কেবল তখনই কাজ করবে যদি আপনি একটি ভিজ্যুয়াল সহ পাস করেন। আপনি যদি দুটি উপাদানের আপেক্ষিক অবস্থান চান এবং একটিতে অন্যটি না থাকে তবে আপনি এর পরিবর্তে ভিজ্যুয়াল.টান্সফর্মটোভিজুয়াল ব্যবহার করতে পারেন।
রবার্ট ম্যাকেনি

4
ট্রান্সফর্মটোভিজুয়াল এখনও একটি সাধারণ পূর্বপুরুষের প্রয়োজন যা নিয়ন্ত্রণ পপআপে থাকলে সমস্যা হতে পারে
অ্যাডাম মিলস

4
সুপার স্বজ্ঞাত! তারা কি "getRelativePosition" কলটিতে এটিকে গুটিয়ে রাখতে পারে না? :-) সাহায্যের জন্য ধন্যবাদ. +1
পল

4
@ cod3monk3y - অথবা সম্ভবত, যদি মাইক্রোসফ্ট ওপেন সোর্স ডাব্লুপিএফ প্রকাশ করে, আমি তাদের একটি অনুরোধ পাঠাব :-)
পল

43

উইন্ডোতে কোনও ইউআই উপাদানটির পরম অবস্থান পেতে আপনি ব্যবহার করতে পারেন:

Point position = desiredElement.PointToScreen(new Point(0d, 0d));

আপনি যদি কোনও ব্যবহারকারীর নিয়ন্ত্রণের মধ্যে থাকেন এবং কেবল সেই নিয়ন্ত্রণের মধ্যে ইউআই উপাদানটির আপেক্ষিক অবস্থান চান তবে কেবল ব্যবহার করুন:

Point position = desiredElement.PointToScreen(new Point(0d, 0d)),
controlPosition = this.PointToScreen(new Point(0d, 0d));

position.X -= controlPosition.X;
position.Y -= controlPosition.Y;

4
মনে রাখবেন আপনার ডিসপ্লে স্কেলিংটি 100% (যেমন উচ্চ ডিপিআই স্ক্রিনে) সেট না করা থাকলে এটি সম্ভবত আপনি যা প্রত্যাশা করেন তা করে না।
ড্রয় নোকস

18

একটি স্ট্যাটিক শ্রেণিতে এই পদ্ধতিটি যুক্ত করুন:

 public static Rect GetAbsolutePlacement(this FrameworkElement element, bool relativeToScreen = false)
    {
        var absolutePos = element.PointToScreen(new System.Windows.Point(0, 0));
        if (relativeToScreen)
        {
            return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight);
        }
        var posMW = Application.Current.MainWindow.PointToScreen(new System.Windows.Point(0, 0));
        absolutePos = new System.Windows.Point(absolutePos.X - posMW.X, absolutePos.Y - posMW.Y);
        return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight);
    }

পুরো পর্দার উপরের বাম কোণ থেকে প্লেসমেন্ট সেট relativeToScreenকরতে trueবা falseঅ্যাপ্লিকেশন উইন্ডোর উপরের বাম কোণ থেকে প্লেসমেন্ট সেট করুন ।


4
এটি দুর্দান্ত কাজ করে! আমি এটিকে অ্যানিমেশন দিয়ে ব্যবহার করছি RenderTransformযা উপাদানটির পরিবর্তনের মাধ্যমে একটি চিত্র অন- বা অফ-স্ক্রিনকে স্লাইড করে এবং তাই এটির স্ক্রিনে উপাদানটির পরম অবস্থান জানতে হবে।
cod3monk3y

6

.NET 3.0 থেকে, আপনি সহজভাবে ব্যবহার করতে পারেন *yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*)

এটি আপনাকে আপনার বোতামের 0, 0 পয়েন্টটি দেবে, তবে ধারকটির দিকে। (আপনি অন্য একটি বিষয়ও দিতে পারেন যে ০, ০)

দস্তাবেজের জন্য এখানে পরীক্ষা করুন।


0

এইচএম নিম্নলিখিত কোডটিতে ক্লিক করা উইন্ডোটি আপনাকে নির্দিষ্ট করতে হবে Mouse.GetPosition(IInputElement relativeTo) যা আমার পক্ষে ভাল কাজ করে

protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);
        Point p = e.GetPosition(this);
    }

আমি সন্দেহ করি যে আপনার উইন্ডোটি এর নিজস্ব শ্রেণি থেকে নয় তবে অ্যাপ্লিকেশনটির অন্যান্য বিন্দু থেকে উল্লেখ করা দরকার। এই ক্ষেত্রে Application.Current.MainWindowআপনাকে সাহায্য করবে।


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